之前给CSDN提交了代码显示的问题,今天收到了回复,关于代码显示错误是由于SyntaxHighlighter这个插件的问题,所以,如果有需要使用代码的,请点击代码上方的copy字样。
python challenge level 4的链接为:http://www.pythonchallenge.com/pc/def/linkedlist.php
看到这一题后我发现,还是看页面源代码吧!果然,看完开源代码后就会发现许多问题:
通过以上的发现可以看出,图片链接就是这个题的入手点,那还不赶快点击图片!!!点击图片后会发现页面告诉我们nothing的下一个值是44827,那就按照提示改变nothing的值吧,改着改着就看到提示说你的手累了。很明显,我们需要做的事情就是不停的改变nothing的值,最后会到达某一个页面,而这个页面将会有我们所需要的通关条件。那么赶快来实现第一个版本吧:
#! /usr/bin/env python '''python challenge level 4 question url: http://www.pythonchallenge.com/pc/def/linkedlist.php ''' import re re_match = re.compile(r'\D+(\d+$)').match nothing = '12345' import urllib for i in xrange(400): try: f = urllib.urlopen("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s" % nothing) data = f.read() f.close() nothing = re_match(data).group(1) print i, nothing, data except Exception, e: print e break print data
这个版本很简陋,也许是网络原因,每次运行一段时间后就会遇到各种各样的问题,例如超时,套接字错误,真的是把人都折磨死了,不过程序绝对没有问题。正常的情况下,运行第85次的时候就会遇到断点了,这时就需要手动停止程序,打开对应的网页,查看网页的信息,最后得到的信息是:Yes. Divide by two and keep going.
好吧,先做一个除法,第84次得到是16044,除以2是8022,先把这个数字记下来,然后就是为了以防再出现类似的情况修改一下代码:
#! /usr/bin/env python '''python challenge level 4 question url: http://www.pythonchallenge.com/pc/def/linkedlist.php ''' import re re_match = re.compile(r'\D+(\d+$)').match import sys nothing = sys.argv[1] err_num = 0 pre = '' import urllib for i in xrange(400): try: f = urllib.urlopen("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s" % nothing) data = f.read() f.close() pre = nothing nums = re_match(data) if nums: nothing = nums.group(1) print i, nothing, data else: print 'no match' break except KeyboardInterrupt: print 'user interrupted' break except Exception, e: err_num += 1 print e print 'previous nothing: %s, error occured: %s times\ndata: %s' % (pre, err_num, data)
好吧,程序修改完成,继续运行,在命令行里输入python level4.py 8022然后回车等待程序的结果。在正常情况下运行了53次之后又遇到了一个问题,正则表达式匹配不到合适的数据,看了一下网页的内容,估计是出题者故意的,所以搞成了那种中间段行的形式。不过由于之前更改程序的时候打印除了页面的内容,我们可以根据页面的内容,直接将63579给程序,然后就可以得到最后的结果了。为了更熟练的使用python我并没有选择这样做,我将match改成search,把82682传递给程序,让程序继续往下运行,确实这样程序就能够获取63579的值了,最后又经过了109次的等待之后,终于等到了最后的结果:peak.html
所以,下一题的链接为http://www.pythonchallenge.com/pc/def/peak.html
做完之后思考了一下,把match改为findall也是可以的,不过下面的程序也要跟着做小幅的改动。然后又看了看别人的答案,其实可以直接使用split生成一个list,然后获取这个list的-1就行了,果然因为之前使用的是re,思维被限制住了,等级还是不够。