最近在網(wǎng)上看到一個非常有意思的 Python 游戲通關(guān)網(wǎng)站,一共有 33 關(guān),每一關(guān)都需要利用 Python 知識解題找到答案,然后進(jìn)入下一關(guān)。 很考驗(yàn)對 Python 的綜合掌握能力,比如有的闖關(guān)需要用到正則表達(dá)式,有的要用到爬蟲。 我們平常學(xué) Python 都是按章節(jié)順序、包或者模塊來學(xué),容易前學(xué)后忘。正好可以拿這個網(wǎng)站來綜合測試一下對 Python 的掌握情況,以便查缺補(bǔ)漏。 來說說這個網(wǎng)站怎么玩。 mark 這是網(wǎng)站主頁面,很有歷史感對吧,誕生了已有十幾年了。但千萬不要因?yàn)榭粗窭瞎哦∏扑?/p> mark 我們來玩玩看,點(diǎn)擊「get challenged」開始挑戰(zhàn)。 第 0 關(guān)是 Warming up 熱身環(huán)節(jié): 這一關(guān)要求是修改 URL 鏈接,給的提示是電腦上的數(shù)學(xué)表達(dá)式:2 的 38 次方,所以大概就是需要計算出數(shù)值,然后修改url 進(jìn)入下一關(guān)。 所以這關(guān)就是考 Python 的基本數(shù)值運(yùn)算,你知道怎么算么? 打開 Python 自帶終端,一行代碼就能計算出結(jié)果: mark 把原鏈接中的 mark 游戲這就正式開始了。圖片中的筆記本給了三組字母,很容易發(fā)現(xiàn)規(guī)律:前面的字母往后移動兩位就是后面的字母。 那么需要做的就是根據(jù)這個規(guī)律把下面的提示字符串,做位移解密得到真正的句子含義: 這道題考察字符串編碼和 for 循環(huán)相關(guān)知識,代碼實(shí)現(xiàn)如下: 1text = '''g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq 2 ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q 3 ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq 4 gq pcamkkclbcb. lmu ynnjw ml rfc spj.''' 5 6text_translate = '' 7for i in text: 8 if str.isalpha(i): 9 n = ord(i) 10 if i >= 'y': 11 n = ord(i) 2 - 26 12 else: 13 n = ord(i) 2 14 text_translate = chr(n) 15 else: 16 text_translate = i 17print(text_translate) 得到結(jié)果:
作者很風(fēng)趣,當(dāng)然不能手動去一個推算了,推薦用 string.maketrans 這個方法解決,我們上面采取的是比較直接的方法,官方給出了更為精簡的方法: 1import string 2l = string.lowercase 3t = string.maketrans(l, l[2:] l[:2]) 4print (text.translate(t)) 然后把 url 中的 map 改為ocr回車就來到了第 2 關(guān): mark 作者接著說過關(guān)的提示可能在書里(當(dāng)然不可能了)也可能在網(wǎng)頁源代碼里。那就右鍵查看源代碼往下拉看到綠色區(qū)域,果然找到了問題: mark 意思就是:要在下面這一大串字符里找到出現(xiàn)次數(shù)最少的幾個字符 考察了這么幾個知識點(diǎn):
如果是你,你會怎么做? 來看下,十行代碼快速實(shí)現(xiàn):
首先,用 Requests 請求網(wǎng)頁然后用正則提取出字符串,接著 for 循環(huán)計算每個字符出現(xiàn)的次數(shù)。 1% 6104 2$ 6046 3@ 6157 4_ 6112 5^ 6030 6# 6115 7) 6186 8& 6043 9! 6079 10 6066 11] 6152 12* 6034 13} 6105 14[ 6108 15( 6154 16{ 6046 17 18e 1 19q 1 20u 1 21a 1 22l 1 23i 1 24t 1 25y 1 可以看到出現(xiàn)次數(shù)最少的就是最后幾個字符,合起來是「equality」,替換 url 字符就闖過過了第 2 關(guān)進(jìn)入下一關(guān)繼續(xù)挑戰(zhàn)。是不是有點(diǎn)意思? 后面每一關(guān)都需要用到相關(guān)的 Python 技巧解決,比如第 4 關(guān): mark 這一關(guān)作者弄了個小惡作劇,需要手動輸入數(shù)值到 url 中然后回車,你以為這樣就完了么?并沒有它有會不斷重復(fù)彈出新的數(shù)值讓你輸入,貌似無窮盡。 所以,這一關(guān)肯定不能采取手動輸入的方法闖關(guān),自然要用到 Python 了。要實(shí)現(xiàn)自動填充修改 url 回車跳轉(zhuǎn)到新 url,循環(huán)直到網(wǎng)頁再也無法跳轉(zhuǎn)為止這一功能。 如果是你,你會怎么做? 其實(shí),一段簡單的爬蟲加正則就能搞定。思路很簡單,把每次網(wǎng)頁中的數(shù)值提取出來替換成新的 url 再請求網(wǎng)頁,循環(huán)下去,代碼實(shí)現(xiàn)如下:
輸出結(jié)果如下: 可以看到,最終循環(huán)了 85 次找到了最后一個數(shù)字16044,輸入到 url 中就闖關(guān)成功。 |
|