二分猜数游戏实现 coin1

3 篇文章 0 订阅

pwnable.kr 上的 coin1

这题需要在时间限制内赢100次二分猜数游戏。
记得数据结构课上老师就说过,二分查找的实现还是很容易错的。一开始写的版本总是用光次数猜不对。
网速比较慢的话就得先用其他题的账户登上去然后本地连接到9007端口执行。

from pwn import *

sh = remote('pwnable.kr', 9007)
sh.recvuntil('starting in 3 sec')
print 'Waiting for 3 sec to start ...'

def play_round():
    sh.recvuntil('N=')
    N = int(sh.recvuntil(' '))
    print 'N=%d' % N
    sh.recvuntil('C=')
    C = int(sh.recvuntil('\n').replace('\n', '').rstrip())
    print 'C=%d' % C

	# binary search
    lo = 0
    hi = N-1
    cnt = 0
    re = -1
    while lo < hi:
        cnt += 1
        mi = lo + (hi - lo) / 2
        guess = ' '.join([str(i) for i in range(lo, mi+1)])
        # print 'Test #', cnt, 'range: [%4d, %4d]' % (lo, hi), 'Guess: [%4d, %4d]', lo, mi
        sh.sendline(guess)
        re = int(sh.recvline())
        # print 'Ret:', re
        if re < 10 * (mi - lo + 1):
            hi = mi
        else:
            lo = mi+1
    while  cnt < C:
        cnt += 1
        sh.sendline(str(lo))
        re = int(sh.recvline())
    print 'Aha! Found:', lo, 'Sending...'
    sh.sendline(str(lo))
    print sh.recvuntil('\n') # receive "Congraduate (#round_number)"

win = 0
while win < 100:
    play_round()
    win += 1

sh.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值