我大学剩下一年半的生活(五)——pythonchallenge之level4

之前给CSDN提交了代码显示的问题,今天收到了回复,关于代码显示错误是由于SyntaxHighlighter这个插件的问题,所以,如果有需要使用代码的,请点击代码上方的copy字样。

python challenge level 4的链接为:http://www.pythonchallenge.com/pc/def/linkedlist.php

看到这一题后我发现,还是看页面源代码吧!果然,看完开源代码后就会发现许多问题:

  1. 我们最好使用urllib
  2. 有一个不知道是什么的nothing
  3. 某一件事要做400遍左右
  4. 这个图片其实是一个链接
  5. 这个图片的链接传递的是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,思维被限制住了,等级还是不够。

你可能感兴趣的:(exception,python,生活,正则表达式,list,import)