最近在做PythonChallenge,挺有意思的,不少都靠谷歌才有了idea,不过代码都是自己写的,记录下,免得将来忘掉。(不要直接用这里的答案来过关哦,Avoid looking for spoilers.)

p.s. 科普:PythonChallenge分0-33共34关,当你开始玩这个游戏时,网站会告诉你第一关的地址以及有关后面关卡的地址的提示,你的任务就是尽量搜集这些有关下一关的地址的线索,然后找到下一关的确切地址(通常需要编程)。听起来有点像寻宝游戏,其实却是差不多。

注:所有程序在Windows XP sp3 + Python 3.2 下调试通过哦,如果涉及到第三方包,则对其版本另作说明。

0. 0.html

话说Hint是try to change URL address,这句话既是提示,也为以后解所有问题奠定了基础。

我刚看到这个hint时,看了一眼地址:0.htm,哦,下意识的就直接把0.htm改成了1.htm虽然不是答案但也不远了——在这个页面里有个提示:2**38 is much much larger.
哦,看来确实要计算0.htm那个图片里的那个2的38次方啊,用python计算得
2**38 = 274877906944
OK,输入274877906944.htm,成功进入第一关。

1. map.html

那个图片提示很明显——凯撒密码,凯撒密码非常常见而且易被破解(特别对于长明文),以前看数论与密码,第一章讲的就是这个。

代码可像我这样用chr(ord())来写,也可以提前写个字典然后用string对象translate()函数(就像字母算术的穷举算法那样)。

代码:

  1. # -*- coding : utf-8 -*-   
  2.   
  3. text = “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.”   
  4. trans = ”   
  5.   
  6. for ch in text:   
  7.     if ord(ch) >= ord(‘a’) and ord(ch) <= ord(‘z’):   
  8.         trans = trans + (chr(ord(ch) + 2) if ord(ch) + 2 <= ord(‘z’) else chr(ord(ch) + 2 - 26))   
  9.     else:   
  10.         trans = trans + ch   
  11.   
  12. print(trans)  

 

获得的字符串是:“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.”

OK,将text换成map再运行下程序获得ocr即是下一关地址。

2. ocr.html

打开这一关发现页面上没什么有用的东西,于是打开源代码看下“find rare characters in the mess below”,然后下面一大堆字符,ok,按照他所说的写一个统计字符串字符个数的程序:

  1. # -*- coding: utf-8 -*-   
  2.   
  3. strtext = ”’past by your self
  4. ”’  
  5.   
  6. dictwords = {}   
  7.   
  8. for chtemp in strtext:   
  9.     if chtemp in dictwords:   
  10.         dictwords[chtemp] += 1   
  11.     else:   
  12.         dictwords[chtemp] = 1   
  13.   
  14. print(dictwords)  

 

统计结果是:“{‘\n’: 1221, ‘!’: 6079, ‘#’: 6115, ‘%’: 6104, ‘$’: 6046, ‘&’: 6043, ‘)’: 6186, ‘(‘: 6154, ‘+’: 6066, ‘*’: 6034, ‘@’: 6157, ‘[': 6108, ']‘: 6152, ‘_’: 6112, ‘^’: 6030, ‘a’: 1, ‘e’: 1, ‘i’: 1, ‘l’: 1, ‘q’: 1, ‘u’: 1, ‘t’: 1, ‘y’: 1, ‘{‘: 6046, ‘}’: 6105}”

嗯,那就是’a’, ‘e’, ‘i’, ‘l’, ‘q’, ‘u’, ‘t’, ‘y’了。组成个单词——“equality”。

3. equailty.html

第三关的提示是“One small letter, surrounded by EXACTLY three big bodyguards on each of its sides. ”看那个图,是一个小蜡烛周围有三个大蜡烛,那就是要找符合这样的’x’?——’XXXxXXX’尝试了下发现出来好多字符,显然不符合要求,再看提示,EXACTLY特意大写出来,那估计就是这样了——’xXXXxXXXx’,程序如下:

  1. # -*- coding : utf-8 -*-   
  2.   
  3. ”’写的很烂 仅作参考
  4. 另外还好给的文本里没有那种重复叠加的像 ‘xxxxxxxxxxx’ 这样的 不然用re.findall是不成的  
  5. ”’  
  6.   
  7. import re  
  8.   
  9. text = ”’
  10. ”’  
  11.   
  12. # text自行添加   
  13.   
  14. strpattern = ‘[a-z][a-z]{3}[a-z][a-z]{3}[a-z]‘ # xxxxxxxxx   
  15. strpattresult = re.findall(strpattern, text)   
  16. listtemp = []   
  17.   
  18. for strtemp1 in strpattresult:   
  19.     strtemp2 = “”   
  20.     for chrtemp in strtemp1:   
  21.         if(ord(chrtemp) > 91):   
  22.             strtemp2 = strtemp2 + chrtemp   
  23.     listtemp.append(strtemp2[1])   
  24.   
  25. print(listtemp)  

 
运行后结果如下:['l', 'i', 'n', 'k', 'e', 'd', 'l', 'i', 's', 't']

看来下一关地址就是linkedlist了。

4. linkedlist.php

图片是什么没懂,但是并不妨碍我去点它,点击图片进入地址http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345,上面显示’and the next nothing is 44827′,结合前面网页的标题’follow the chain’,和那句’400 times is more than enough’,基本理解这个意思了。程序:

  1. # -*- coding: utf-8 -*-   
  2.   
  3. import httplib2   
  4.   
  5. strnothing = ”   
  6. lsttemp =[]   
  7.   
  8. h = httplib2.http(‘.cache’)   
  9.   
  10. for i in range(1, 200):   
  11.     if(i/200 *100 % 10 == 0):       # 为了证明这个程序确实在运行 所有我让它每隔10%显示下进度   
  12.         print(i/200*100, ‘%’)   
  13.   
  14.     strurl = \   
  15.         “http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=” + strnothing   
  16.     response, content = \   
  17.       h.request(strurl)   
  18.     strcont = content.decode(‘utf-8′)   
  19.     strnothing = strcont.split()[-1]   
  20.     lsttemp.append(strnothing)   
  21.     if(strnothing.isdigit() == false):   
  22.         break  
  23.   
  24. print(‘finished at ‘, i/200*100, ‘%’)   
  25. print(lsttemp)  

 

运行近1min后终于出了结果:

Finished at 95.5 %
['6711', '2795', '41423', ... , '52899', '66831', 'peak.html']

5. peak.html

图片是一个peak,网页标题是peak hell,提示是pronounce it,如果经常用pickle或者语感比较好的的同学也许能猜出是pickle,我虽然不常用pickle来保存数据,但是因为刚看DIP里的介绍没多久所以也算有点印象,也就猜出来了。源码里有一个链接,banner.p,下下来,用pickle模块load出来:

  1. # -*- coding: utf-8 -*-   
  2.   
  3. import pickle  
  4.   
  5. with open(‘e:\\pythonlearning\\pythonchallenge\\3th.banner.p’, ‘rb’) as f:   
  6.     banner = pickle.load(f)   
  7.   
  8. for lsttemp in banner:   
  9.     for tuptemp in lsttemp:   
  10.         print(tuptemp[0] * tuptemp[-1], end = ”)   
  11.     print()  

 

打印出来一个字符画:

5th. 字符画. channel

One Thought on “PythonChallenge谜题指南(Python3)-1

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

你可以管理本篇文章的订阅。

Post Navigation