一个有趣的网站: http://www.pythonchallenge.com/
集娱乐与学习于一体,在开动脑筋闯关的过程中,不但扩展了思维,还对Python加深了理解。
一共33关,每闯过一关都可以在提示下查看作者给出的Solution。
第0关(指导关):
出现一幅画面,上面写着2**38,教你如何进入下一关。
通过Python客户端,可以简单计算出2**38 = 274877906944
那么按照提示只要将该关网址中0.htm改为274877906944.html 即可
第1关:字符转换
图片上给出了三对字母“K->M, O->Q, E->G",通过分析知道这是一个简单的字符转换,转换规则是new_c=chr(ord(old_c)+2) 超过自动回转。
我们可以看到,该关的网址为http://www.pythonchallenge.com/pc/def/map.html。那么按照指导关给出的策略,只要将map替换为ocr即可通关。但如果仅是如此,那么就完全撇开了Python,该关将彻彻底底地退化为一般的脑筋急转弯。
实际上在图片下有一串看不懂的字符串,按照上述字符转换规则,这应该可以通过python做简单处理,从而得到可识别的字串,代码如下:
或者使用下面的简单方法:
运行脚本,我们将得到下面一段描述:
”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. “
当我们通关之后,通过http://www.pythonchallenge.com/pcc/def/ocr.html 将得到更多关于本关的信息。
第2关:提取有效信息
该关图片上展示了一本书,而图下有一段话“ recognize the characters. maybe they are in the book, but MAYBE they are in the page source ”。通过仔细观察book上的内容,发现无法识别;那么有效信息就应该在page source中。打开页面源代码,可以看到下面的信息:
通过给出的提示“find rare characters in the mess below”,我们可以知道线索就在第二个<!-- -->中,不失一般性,设计python代码如下:
运行脚本得到“e q u a l i t y”,那么通关网址将是 http://www.pythonchallenge.com/pc/def/equality.html
第3关:正则表达式
该关图片下有一句话“ One small letter, surrounded by EXACTLY three big bodyguards on each of its sides. ” 也就是说有一个小写字母,两边各有且仅有三个大写字母。根据上关给出的提示,关键信息可能在Page Source中,经过查看果然如此。
根据提示,满足上述规则的可能有一个,也可能有多个。如果仅有一个,那么找到的这七个字母组成的单词应该就是通关单词;如果有多个,那么所有匹配的小写字母就应该组成一个单词。按常理来讲,通关单词应该是可读、有含义的。下面是编写的Python脚本:
运行脚本得到“linkedlist",进入linkedlist.html 页面,根据提示进入linkedlist.php页面,通关!
第4关 数字串
该关从页面上看不出什么有意义的信息,但我们从页面源代码中可以提取到下面的有效信息
点击图片,得到信息“and the next nothing is 92512”,由此更改网址中参数nothing的值。按照需求我们设计下面的代码:
从nothing值为12345开始,获取网页上的信息,提取出最后的数字,最为nothing值进入下一次循环,最多400次。网页上的信息将记录在numbers.log文件中。运行程序,等待一段时间,从日志中将得到一串信息:
“and the next nothing is 92118
Yes. Divide by two and keep going.”
按照提示,将代码中nothing的初始值12345改为46059。重新执行程序,将得到最终信息“peak.html ”。通关!
第5关:Pickle
图片下有这么一句话“ pronounce it ”,再看源代码:
“peak hell sounds familiar ”?pickle模块。按照给定的文件banner.p,使用pickle解序列,将得到一个包含了不定数个元组的列表的列表。经过分析,每个列表的所有元组的第二项相加均为95,而元组的第一项要么是‘ ’,要么是‘#’;那么,很显然按一行95个字符的排列输出将得到有效信息,代码如下:
运行程序,将得到channel字样。下一关网址将是channel.html ,通关!