之前给优快云提交了代码显示的问题,今天收到了回复,关于代码显示错误是由于SyntaxHighlighter这个插件的问题,所以,如果有需要使用代码的,请点击代码上方的copy字样。
python challenge level 4的链接为:http://www.pythonchallenge.com/pc/def/linkedlist.php
看到这一题后我发现,还是看页面源代码吧!果然,看完开源代码后就会发现许多问题:
- 我们最好使用urllib
- 有一个不知道是什么的nothing
- 某一件事要做400遍左右
- 这个图片其实是一个链接
- 这个图片的链接传递的是nothing的值,这也就是上面的注释所提到的nothing了
通过以上的发现可以看出,图片链接就是这个题的入手点,那还不赶快点击图片!!!点击图片后会发现页面告诉我们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,思维被限制住了,等级还是不够。