我們平常學 Python 都是按章節順序、包或者模塊來學,容易前學后忘。正好可以拿這個網站來綜合測試一下對 Python 的掌握情況,以便查缺補漏。
來說說這個網站怎么玩。
這是網站主頁面,很有歷史感對吧,誕生了已有十幾年了。但千萬不要因為看著像老古董而小瞧它。
我們來玩玩看,點擊「get challenged」開始挑戰。
第 0 關是 Warming up 熱身環節:
這一關要求是修改 URL 鏈接,給的提示是電腦上的數學表達式:2 的 38 次方,所以大概就是需要計算出數值,然后修改url 進入下一關。
所以這關就是考 Python 的基本數值運算,你知道怎么算么?
打開 Python 自帶終端,一行代碼就能計算出結果:
把原鏈接中的 0替換為 274877906944回車就會進入下一關:
游戲這就正式開始了。圖片中的筆記本給了三組字母,很容易發現規律:前面的字母往后移動兩位就是后面的字母。
那么需要做的就是根據這個規律把下面的提示字符串,做位移解密得到真正的句子含義:
這道題考察字符串編碼和 for 循環相關知識,代碼實現如下:
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.''' text_translate = '' for i in text: if str.isalpha(i): n = ord(i) if i >= 'y': n = ord(i) + 2 - 26 else: n = ord(i) + 2 text_translate += chr(n) else: text_translate += i print(text_translate)
得到結果:
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.
作者很風趣,當然不能手動去一個推算了,推薦用 string.maketrans() 這個方法解決,我們上面采取的是比較直接的方法,官方給出了更為精簡的方法:
import string l = string.lowercase t = string.maketrans(l, l[2:] + l[:2]) print (text.translate(t))
然后把 url 中的 map 改為ocr回車就來到了第 2 關:
作者接著說過關的提示可能在書里(當然不可能了)也可能在網頁源代碼里。那就右鍵查看源代碼往下拉看到綠色區域,果然找到了問題:
意思就是:要在下面這一大串字符里找到出現次數最少的幾個字符
考察了這么幾個知識點:
正則表達式提取字符串
list 計數
條件語句
如果是你,你會怎么做?
來看下,十行代碼快速實現:
import requests url = 'http://www.pythonchallenge.com/pc/def/ocr.html' res = requests.get(url).text text = re.findall('.*?<!--.*-->.*<!--(.*)-->',res,re.S) # list轉為str便于遍歷字符 str = ''.join(text) lst = [] key=[] #遍歷字符 for i in str: #將字符存到list中 lst.append(i) #如果字符是唯一的,則添加進key if i not in key: key.append(i) # 將list列表中的字符出現字數統計出來 for items in key: print(items,lst.count(items))
首先,用 Requests 請求網頁然后用正則提取出字符串,接著 for 循環計算每個字符出現的次數。
% 6104 $ 6046 @ 6157 _ 6112 ^ 6030 # 6115 ) 6186 & 6043 ! 6079 + 6066 ] 6152 * 6034 } 6105 [ 6108 ( 6154 { 6046 e 1 q 1 u 1 a 1 l 1 i 1 t 1 y 1
可以看到出現次數最少的就是最后幾個字符,合起來是「equality」,替換 url 字符就闖過過了第 2 關進入下一關繼續挑戰。是不是有點意思?
后面每一關都需要用到相關的 Python 技巧解決,比如第 4 關:
這一關作者弄了個小惡作劇,需要手動輸入數值到 url 中然后回車,你以為這樣就完了么?并沒有它有會不斷重復彈出新的數值讓你輸入,貌似無窮盡。
所以,這一關肯定不能采取手動輸入的方法闖關,自然要用到 Python 了。要實現自動填充修改 url 回車跳轉到新 url,循環直到網頁再也無法跳轉為止這一功能。
如果是你,你會怎么做?
其實,一段簡單的爬蟲加正則就能搞定。思路很簡單,把每次網頁中的數值提取出來替換成新的 url 再請求網頁,循環下去,代碼實現如下:
import requests import re import os # 首頁url resp = requests.get( 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345').text url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=' # 計數器 count = 0 while True: try: # 提取下一頁動態數值 nextid = re.search('d+', resp).group() count = count + 1 nextid = int(nextid) except: print('最后一個url為:%s' % nexturl) break # 獲取下一頁url nexturl = url + str(nextid) print('url %s:%s' % (count, nexturl)) # 重復請求 resp = requests.get(nexturl).text
輸出結果如下:
可以看到,最終循環了 85 次找到了最后一個數字16044,輸入到 url 中就闖關成功。
如果遇到不會做的題,可以在這里找到參考答案:
中參考文教程:
https://www.cnblogs.com/jimnox/archive/2009/12/08/tips-to-python-challenge.html
官方參考教程:
http://garethrees.org/2007/05/07/python-challenge/
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com