Tag Archives: Pythonchallenge

最近在做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”。
Read More →