最近在網上看到一個非常有意思的 Python 游戲通關網站,一共有 33 關,每一關都需要利用 Python 知識解題找到答案,然后進入下一關。
很考驗對 Python 的綜合掌握能力,比如有的闖關需要用到正則表達式,有的要用到爬蟲。
我們平常學 Python 都是按章節順序、包或者模塊來學,容易前學后忘。正好可以拿這個網站來綜合測試一下對 Python 的掌握情況,以便查缺補漏。
來說說這個網站怎么玩。
mark
這是網站主頁面,很有歷史感對吧,誕生了已有十幾年了。但千萬不要因為看著像老古董而小瞧它。
mark
我們來玩玩看,點擊「get challenged」開始挑戰。
第 0 關是 Warming up 熱身環節:
這一關要求是修改 URL 鏈接,給的提示是電腦上的數學表達式:2 的 38 次方,所以大概就是需要計算出數值,然后修改url 進入下一關。
所以這關就是考 Python 的基本數值運算,你知道怎么算么?
打開 Python 自帶終端,一行代碼就能計算出結果:
mark
把原鏈接中的0替換為274877906944回車就會進入下一關:
mark
游戲這就正式開始了。圖片中的筆記本給了三組字母,很容易發現規律:前面的字母往后移動兩位就是后面的字母。
那么需要做的就是根據這個規律把下面的提示字符串,做位移解密得到真正的句子含義:
這道題考察字符串編碼和 for 循環相關知識,代碼實現如下:
1text='''gfmncwmsbgblrrpylqjyrcgrzwfylb.rfyrqufyramknsrcpq 2
ypcdmp.bmglegrglzwfylbgqglcddgagclrylbrfyr'q 3
ufwrfgqrcvrgqqmjmle.sqgleqrpgle.kyicrpylq() 4
gqpcamkkclbcb.lmuynnjwmlrfcspj.''' 5 6text_translate='' 7foriintext: 8
ifstr.isalpha(i): 9
n=ord(i)10
ifi>='y':11
n=ord(i)+2-2612
else:13
n=ord(i)+214
text_translate+=chr(n)15
else:16
text_translate+=i17print(text_translate)
得到結果:
1ihopeyoudidnttranslateitbyhand.2thatswhatcomputersarefor.3doingitinbyhandisinefficientandthat'swhythistextissolong.4usingstring.maketrans()isrecommended.nowapplyontheurl.
作者很風趣,當然不能手動去一個推算了,推薦用 string.maketrans() 這個方法解決,我們上面采取的是比較直接的方法,官方給出了更為精簡的方法:
1importstring2l=string.lowercase3t=string.maketrans(l,l[2:]+l[:2])4print(text.translate(t))
然后把 url 中的 map 改為ocr回車就來到了第 2 關:
mark
作者接著說過關的提示可能在書里(當然不可能了)也可能在網頁源代碼里。那就右鍵查看源代碼往下拉看到綠色區域,果然找到了問題:
mark
意思就是:要在下面這一大串字符里找到出現次數最少的幾個字符
考察了這么幾個知識點:
正則表達式提取字符串
list 計數
條件語句
如果是你,你會怎么做?
首先,用 Requests 請求網頁然后用正則提取出字符串,接著 for 循環計算每個字符出現的次數。
1%6104 2$6046 3@6157 4_6112 5^6030 6#6115 7)6186 8&6043 9!607910+606611]615212*603413}610514[610815(615416{60461718e119q120u121a122l123i124t125y1
可以看到出現次數最少的就是最后幾個字符,合起來是「equality」,替換 url 字符就闖過過了第 2 關進入下一關繼續挑戰。是不是有點意思?
后面每一關都需要用到相關的 Python 技巧解決,比如第 4 關:
mark
這一關作者弄了個小惡作劇,需要手動輸入數值到 url 中然后回車,你以為這樣就完了么?并沒有它有會不斷重復彈出新的數值讓你輸入,貌似無窮盡。
所以,這一關肯定不能采取手動輸入的方法闖關,自然要用到 Python 了。要實現自動填充修改 url 回車跳轉到新 url,循環直到網頁再也無法跳轉為止這一功能。
如果是你,你會怎么做?
其實,一段簡單的爬蟲加正則就能搞定。思路很簡單,把每次網頁中的數值提取出來替換成新的 url 再請求網頁,循環下去,代碼實現如下:
1importrequests 2importre 3importos 4 5#首頁url 6resp=requests.get( 7'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345').text 8url='http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=' 9#計數器10count=011whileTrue:12try:13#提取下一頁動態數值14nextid=re.search('d+',resp).group()15count=count+116nextid=int(nextid)17except:18print('最后一個url為:%s'%nexturl)19break2021#獲取下一頁url22nexturl=url+str(nextid)23print('url%s:%s'%(count,nexturl))24#重復請求25resp=requests.get(nexturl).text
輸出結果如下:
可以看到,最終循環了 85 次找到了最后一個數字16044,輸入到 url 中就闖關成功。
-
python
+關注
關注
56文章
4801瀏覽量
84882 -
數值運算
+關注
關注
0文章
2瀏覽量
5048
原文標題:33關Python游戲,測試你的爬蟲能力到底及格不?
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論