作者 | 蘇克1900
責編 | 胡巍巍
轉載自高級農民工(ID: Mocun6)
最近在網上看到一個非常有意思的 Python 游戲通關網站,一共有 33 關,每一關都需要利用 Python 知識解題找到答案,然后進入下一關。
很考驗對 Python 的綜合掌握能力,比如有的闖關需要用到正則表達式,有的要用到爬蟲。
我們平常學 Python 都是按章節順序、包或者模塊來學,容易前學后忘。正好可以拿這個網站來綜合測試一下對 Python 的掌握情況,以便查缺補漏。
來說說這個網站怎么玩。
mark
這是網站主頁面,很有歷史感對吧,誕生了已有十幾年了。但千萬不要因為看著像老古董而小瞧它。
mark
我們來玩玩看,點擊「get challenged」開始挑戰。
第 0 關是 Warming up 熱身環節:
這一關要求是修改 URL 鏈接,給的提示是電腦上的數學表達式:2 的 38 次方,所以大概就是需要計算出數值,然后修改url 進入下一關。
所以這關就是考 Python 的基本數值運算,你知道怎么算么?
打開 Python 自帶終端,一行代碼就能計算出結果:
mark
把原鏈接中的
?
0
替換為
?
274877906944
回車就會進入下一關:
mark
游戲這就正式開始了。圖片中的筆記本給了三組字母,很容易發現規律:前面的字母往后移動兩位就是后面的字母。
那么需要做的就是根據這個規律把下面的提示字符串,做位移解密得到真正的句子含義:
這道題考察字符串編碼和 for 循環相關知識,代碼實現如下:
1
text?=?
'''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
6
text_translate?=?
''
7
for
?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
17
print(text_translate)
得到結果:
1
i?hope?you?didnt?translate?it?by?hand.?
2
thats?what?computers?are?for.?
3
doing?it?in?by?hand?is?inefficient?and?that's?why?this?text?is?so?long.?
4
using?string.maketrans()is?recommended.?now?apply?on?the?url.
作者很風趣,當然不能手動去一個推算了,推薦用 string.maketrans() 這個方法解決,我們上面采取的是比較直接的方法,官方給出了更為精簡的方法:
1
import
?string
2
l?=?string.lowercase
3
t?=?string.maketrans(l,?l[
2
:]?+?l[:
2
])
4
print
?(text.translate(t))
然后把 url 中的 map 改為ocr回車就來到了第 2 關:
mark
作者接著說過關的提示可能在書里(當然不可能了)也可能在網頁源代碼里。那就右鍵查看源代碼往下拉看到綠色區域,果然找到了問題:
mark
意思就是:要在下面這一大串字符里找到出現次數最少的幾個字符
考察了這么幾個知識點:
-
正則表達式提取字符串
-
list 計數
-
條件語句
如果是你,你會怎么做?
來看下,十行代碼快速實現:
1
import
?requests
2
url?=?
'http://www.pythonchallenge.com/pc/def/ocr.html'
3
res?=?requests.get(url).text
4
text?=?re.findall(
'.*?
.*
'
,res,re.S)
5
#?list轉為str便于遍歷字符
6
str?=?
''
.join(text)
7
8
lst?=?[]
9
key=[]
10
#遍歷字符
11
for
?i?
in
?str:
12
????
#將字符存到list中
13
????lst.append(i)
14
????
#如果字符是唯一的,則添加進key
15
????
if
?i?
not
?
in
?key:
16
????????key.append(i)
17
#?將list列表中的字符出現字數統計出來
18
for
?items?
in
?key:
19
????print(items,lst.count(items))
首先,用 Requests 請求網頁然后用正則提取出字符串,接著 for 循環計算每個字符出現的次數。
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
18
e?
1
19
q?
1
20
u?
1
21
a?
1
22
l?
1
23
i?
1
24
t?
1
25
y?
1
可以看到出現次數最少的就是最后幾個字符,合起來是「equality」,替換 url 字符就闖過過了第 2 關進入下一關繼續挑戰。是不是有點意思?
后面每一關都需要用到相關的 Python 技巧解決,比如第 4 關:
mark
這一關作者弄了個小惡作劇,需要手動輸入數值到 url 中然后回車,你以為這樣就完了么?并沒有它有會不斷重復彈出新的數值讓你輸入,貌似無窮盡。
所以,這一關肯定不能采取手動輸入的方法闖關,自然要用到 Python 了。要實現自動填充修改 url 回車跳轉到新 url,循環直到網頁再也無法跳轉為止這一功能。
如果是你,你會怎么做?
其實,一段簡單的爬蟲加正則就能搞定。思路很簡單,把每次網頁中的數值提取出來替換成新的 url 再請求網頁,循環下去,代碼實現如下:
1
import
?requests
2
import
?re
3
import
?os
4
5
#?首頁url
6
resp?=?requests.get(
7
????
'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345'
).text
8
url?=?
'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
9
#?計數器
10
count?=?
0
11
while
?
True
:
12
????
try
:
13
????????
#?提取下一頁動態數值
14
????????nextid?=?re.search(
'\d+'
,?resp).group()
15
????????count?=?count?+?
1
16
????????nextid?=?int(nextid)
17
????
except
:
18
????????print(
'最后一個url為:%s'
?%?nexturl)
19
????????
break
20
21
????
#?獲取下一頁url
22
????nexturl?=?url?+?str(nextid)
23
????print(
'url?%s:%s'
?%?(count,?nexturl))
24
????
#?重復請求
25
????resp?=?requests.get(nexturl).text
輸出結果如下:
可以看到,最終循環了 85 次找到了最后一個數字16044,輸入到 url 中就闖關成功。
33 關既有趣又能鍛煉使用 Python 解決問題的技巧,感興趣的話去玩玩看。
網址:http://www.pythonchallenge.com/
如果遇到不會做的題,可以在這里找到參考答案:
中參考文教程:
https://www.cnblogs.com/jimnox/archive/2009/12/08/tips-to-python-challenge.html
官方參考教程:
http://garethrees.org/2007/05/07/python-challenge/
(*本文為 AI科技大本營轉載文章,轉載請聯系原作者)
◆
CTA核心技術及應用峰會
◆
5月25-27日,由中國IT社區CSDN與數字經濟人才發展中心聯合主辦的第一屆CTA核心技術及應用峰會將在杭州國際博覽中心隆重召開,峰會將圍繞人工智能領域,邀請技術領航者,與開發者共同探討機器學習和知識圖譜的前沿研究及應用。 議程設置請請識別海報二維碼查看。
目前CTA峰會倒計時5天!還沒有拿到入場券的小伙伴可以掃描識別海報二維碼或者點擊閱讀原文,即刻搶購。你也 添加小助手微信 15101014297 ,備注“ CTA ”,了解票務以及會務詳情。
推薦閱讀
-
掌聲送給TensorFlow 2.0!用Keras搭建一個CNN | 入門教程
-
一文回顧AI繪畫的成長之路:從簡筆畫到真實人臉生成
-
清華AI學堂班:姚期智擔任首席教授,2019年首批招收30人
-
中國AI開發者真實現狀:寫代碼這條路,會走多久?
-
520 這天,我突然意識到,她根本配不上我這么聰明的男人
-
厲害!女學生偷師男子學校,變身區塊鏈開發工程師
-
確實, 5G與物聯網離不開區塊鏈!
-
刷了一個半月算法題,我薪資終于Double了
-
Linux 之父:我就是覺得蘋果沒意思!| 人物志
-
這本京東斷貨王的Python神書,刷爆整個編程圈!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
