1. 程式人生 > >The Python Challenge 謎題全解(持續更新)

The Python Challenge 謎題全解(持續更新)

Python Challenge(0-2)

The Python Challengehttp://www.pythonchallenge.com/

是個很有意思的網站,可以磨練使用python的技巧,每一關都有挑戰,要編寫相應的程式碼算出關鍵詞,才可以獲取下一關的url,還是很好玩的QAQ


LEVEL 0

顯然是計算圖片中的\(2^{38}\),結果為274877906944,所以url為http://www.pythonchallenge.com/pc/def/274877906944.html

print(2**38)  #輸出274877906944

LEVEL 1

仔細觀察\(K→M,O→Q,E→G\)

有什麼規律,結論是後面的字母在字母表中都是前一個的索引加二,比如#\(K\)是第11個,\(M\)是第13個,所以我們也可以得出轉換字串的方法:

import string
a = "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. "

l = string.ascii_lowercase + "ab"   #每次都是+2,所以後面多加了2個字母,這是小寫字母表

def tran(s):
    tmp =""
    for i in s:
        if i in l:  #如果當前處理的字元是字母
            id = l.index(i)
            tmp += l[id+2]
        else:
            tmp += i
    return tmp
print(tran(a))

#輸出了
"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. "

#翻譯過來就是:
我希望你不是徒手進行這個字元轉換,這是計算機擅長的事情,徒手做是很低效的,所以我才把這個文字弄得這麼長,將剛才你寫的處理字串的函式用在url上試試

顯然,呼叫一下就把url中的map換成了ocr,得到了下一關的url:www.pythonchallenge.com/pc/def/ocr.html


LEVEL 2

顯然第三關要看清楚圖片上的文字是不可能的,下面提示的文字裡面有page source,於是馬上想到檢視網頁原始碼,於是看到了如下內容:

<!--find rare characters in the mess below:-->
然後就是一長串亂碼

任務很顯然,就是要找到下面很長一串程式碼中單獨的元素,複製這麼長的程式碼到ide裡也不方便,所以可以用爬蟲

import requests
from collections import Counter

text = requests.get("http://www.pythonchallenge.com/pc/def/ocr.html").text  #獲取HTML文件
final_text = text.split("<!--")[2][:-3]     #用了比較蠢的方法,用“<!--"當做分隔符,[:-3]是為了清除最後的"-->"

q = Counter(final_text)     #對裡面的所有字元計數
t = [i for i in q if q[i]==1]   #找出只出現一次的字元
print("".join(t))
#輸出了equality

根據輸出的內容很顯然下一個網頁的url為http://www.pythonchallenge.com/pc/def/equality.html