2014年9月30日 星期二 晴

今晚上网翻了翻网页,看到http://www.pythonchallenge.com/,看了两道题,觉得饶有趣味,不如做这个来打发一下时间,可能比玩游戏的好。

下面是我做的一些思路和答案,没做过的就不要往下看了,没意思的,跟剧透没啥差别。如果正在做,但实在没思路的话,可以往下来这里看看。

另,本文是在https://stackedit.io/editor 上编辑的,发现这个网站关闭后下回还是我上次编译的结果,可以当成是草稿来用,还支持markdown。

Level 0: 图片是2^38,而url是http://www.pythonchallenge.com/pc/def/0.html,那么用2^38来替换url中的数字试试看,最后url会被重定向到下一关的url上,即http://www.pythonchallenge.com/pc/def/map.html

[code]def Challenge0(): print ‘url= http://www.pythonchallenge.com/pc/def/0.html' print ‘answer = http://www.pythonchallenge.com/pc/def/%d.html' % (pow(2,38))[/code]

这道题只是warming up,主要是告诉我们游戏的规则,下一level的url是要自己推理出来的。

Level 1: 一看就是字符转换的题,简单的加密题,规则就是字母的Ascii码加2后变成另一字母,都是小写的,z加2后可以循环变为b。

我的写法不太简洁,但是好帮助理解,参考如下: [code]def Challenge2(): url = ‘http://www.pythonchallenge.com/pc/def/274877906944.html' riddle = ‘‘‘g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr’q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj.’’’ #lower-case letters result = [] for c in riddle: if c.isalpha(): if ord(c) + 2 > ord(‘z’): result.append(chr(ord(c) + 2 - 26)) else: result.append(chr(ord(c) + 2)) else: result.append(c) print ‘’.join(result)[/code]

运行结果:i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that’s why this text is so long. using string.maketrans() is recommended. now apply on the url.

根据运行结果,尝试用一把string.maketrans(),应用到url上,如下: [code]def Challenge1b(): import string url = ‘http://www.pythonchallenge.com/pc/def/map.html' table = string.maketrans(string.ascii_lowercase,string.ascii_lowercase[2:]+string.ascii_lowercase[:2]); print string.translate(url,table)[/code]

用Challenge2()和Challenge2b()的算法,都能获得同样的结果,即jvvr://yyy.ravjqpejcnngpig.eqo/re/fgh/ocr.jvon。

根据之前的规则,把map替换成ocr,即可获得level 2的url,即http://www.pythonchallenge.com/pc/def/ocr.htm

Python Challenge可以查看上一题的参考代码,方法:将当前url里的/pc改成/pcc即可,所以Level1的参考代码可以查看:http://www.pythonchallenge.com/pcc/def/ocr.html (To see the solutions to the previous level, replace pc with pcc, i.e. go to: http://www.pythonchallenge.com/pcc/def/ocr.html

官方的参考答案最终跳转到:http://wiki.pythonchallenge.com/index.php?title=Level1:Main_Page 答案可以有很多种,我觉得主要是自己能理解就好。

Level 2: 页面给了一个打开的图书,字非常小,看不清楚。下面是提示:recognize the characters. maybe they are in the book, but MAYBE they are in the page source.

点开网页源代码,发现真正的题目,find rare characters in the mess below。

[code]def Challenge2(): mess = ‘‘‘mess characters……’’’ mydict = {} minnum = 0 for c in mess: if c in mydict: mydict[c] += 1 else: mydict[c] = 1 print sorted(mydict.items(), key=lambda d:d[1], reverse = False )[/code]

打印出来的结果如下: [(‘a’, 1), (’e’, 1), (‘i’, 1), (’l’, 1), (‘q’, 1), (‘u’, 1), (’t’, 1), (‘y’, 1), (’\n’, 1220), (’^’, 6030),….]

可以看出,rare characters恰好都是字母,于是代码就好写了。 [code]def Challenge2b(): import re print ‘’.join(re.findall(’[a-z]’, mess))[/code]

得到结果:equality 于是,下一Level的url是http://www.pythonchallenge.com/pc/def/equality.htm

真的挺有意思的,今晚就先做到这里。