2014年10月1日 星期三 晴
Level 3: http://www.pythonchallenge.com/pc/def/equality.html
谜面很简单,One small letter, surrounded by EXACTLY three big bodyguards on each of its sides.,一看就是暗示大小写字母的。 还是跟上题那样去Html源代码里找这样特征的小写字母,然后拼在一起就可以了。一个正则表达式足矣。
[code]import urllib,re def get_url_data(url): nFail = 0 while nFail < 5: try: sock = urllib.urlopen(url) htmlSource = sock.read() sock.close() return htmlSource except: nFail += 1 print “get url fail:%s count=%d” % (url,nFail) print “get url fail:%s” % (url) return None
def Challenge3(): url = ‘http://www.pythonchallenge.com/pc/def/equality.html' rsp = get_url_data(url)#我的一个函数 riddle_obj = re.compile(’’’</html>’’’) objs = riddle_obj.findall(rsp.replace(’\n’,’’)) if objs: answer_obj = re.compile("[^A-Z][A-Z][A-Z]A-Z[A-Z][A-Z][A-Z][^A-Z]") objs = answer_obj.findall(objs[0]) if objs: print ‘’.join(objs) else: print ‘Mission failed.’[/code]
打印出linkedlist,那么下一Level的url就是http://www.pythonchallenge.com/pc/def/linkedlist.html ,浏览器输入给出的rsp是linkedlist.php,把url改为http://www.pythonchallenge.com/pc/def/linkedlist.php ,进入下一Level。
Level 4: http://www.pythonchallenge.com/pc/def/linkedlist.php
页面只显示了一张图片,直接看HTML Source,“”,提示用urllib,最多尝试400次。
还给了第一个链接,linkedlist.php?nothing=12345,访问http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345,我们可以发现出来的页面是and the next nothing is 44827,这下子就明白了,每次出来一串数字作为下一个url的参数,最多查找400次。
我的代码: [code]def Challenge4(): url = ‘http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s' answer_obj = re.compile(‘‘‘and the next nothing is (\d+)’’’) key = ‘12345’ for loop in xrange(400): print loop,key rsp = get_url_data(url % (str(key))) if rsp: objs = answer_obj.findall(rsp) if objs: key = objs[0] else: break print url % (str(key))[/code]
最后的三行打印如下: 85 16044 http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=16044 Yes. Divide by two and keep going.
这跟验证码一样,打开http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=8022,发现又继续循环了,俺服了,继续修改程序。
[code]def Challenge4(): url = ‘http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=%s' answer_obj = re.compile(‘‘‘and the next nothing is (\d+)’’’) key = ‘12345’#也可以继续从上一个程序的16044开始 for loop in xrange(400): print loop,key rsp = get_url_data(url % (str(key))) if rsp: objs = answer_obj.findall(rsp) if objs: key = objs[0] else: if ‘Divide by two’ in rsp: key = int(key) / 2 else: break print url % (str(key)) rsp = get_url_data(url % (str(key))) if rsp: print rsp[/code]
最后两行运行结果: http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=66831 peak.html
OK,下一Level的url是http://www.pythonchallenge.com/pc/def/peak.html
Level 5: http://www.pythonchallenge.com/pc/def/peak.html
页面只有一张图片,直接看HTML源代码。
看了一下http://www.pythonchallenge.com/pc/def/banner.p的内容,似曾相识,想了半天,似乎是pickle序列化的内容。其他编程语言怎么做做这道题呢?
[code]def Challenge5(): import pickle url = ‘http://www.pythonchallenge.com/pc/def/banner.p' rsp = get_url_data(url) if rsp: obj = pickle.loads(rsp) print obj[/code]
反序列化得出 [[(’ ‘, 95)], [(’ ‘, 14), (’#’, 5), (’ ‘, 70), (’#’, 5), (’ ‘, 1)], [(’ ‘, 15), (’#’, 4), (’ ‘, 71), (’#’, 4), (’ ‘, 1)], [(’ ‘, 15), (’#’, 4), (’ ‘, 71), (’#’, 4), (’ ‘, 1)], …..]
经观察:
- 这个对象是许多List组成的List,每个List由Tuple组成。
- Tuple里的数字之和加起来等于95。
- Tuple都是由两个元素组成,前者是空或者#,后者是数字。
突然明白了,看起来像是要求打印空和#出来,空或者#是显示字符,数字是控制打印的字数。每行一共打印95列。想明白就好办了,代码如下:
[code]def Challenge5(): import pickle url = ‘http://www.pythonchallenge.com/pc/def/banner.p' rsp = get_url_data(url) if rsp: objs = pickle.loads(rsp) for obj in objs: print("".join([n*ch for ch, n in obj]))[/code]
打印出来是Channel,则下一Level的Url是http://www.pythonchallenge.com/pc/def/channel.html (试了一下,不是Channel,而是channel)
看到打印结果,感觉真美,打印出来真美,Python真美,心里也很美。如果写小说的话,加入这些推理元素的话,估计很多程序员爱看,呵呵。就跟红楼梦里有菜谱,就有好事者研究那些菜怎么做一样。
上午就做到这里,好东西要慢慢品尝。
...