作者 | 蘇克1900
責(zé)編 | 胡巍巍
轉(zhuǎn)載自高級農(nóng)民工(ID: Mocun6)
最近在網(wǎng)上看到一個(gè)非常有意思的 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é)后忘。正好可以拿這個(gè)網(wǎng)站來綜合測試一下對 Python 的掌握情況,以便查缺補(bǔ)漏。
來說說這個(gè)網(wǎng)站怎么玩。
mark
這是網(wǎng)站主頁面,很有歷史感對吧,誕生了已有十幾年了。但千萬不要因?yàn)榭粗窭瞎哦∏扑?
mark
我們來玩玩看,點(diǎn)擊「get challenged」開始挑戰(zhàn)。
第 0 關(guān)是 Warming up 熱身環(huán)節(jié):
這一關(guān)要求是修改 URL 鏈接,給的提示是電腦上的數(shù)學(xué)表達(dá)式:2 的 38 次方,所以大概就是需要計(jì)算出數(shù)值,然后修改url 進(jìn)入下一關(guān)。
所以這關(guān)就是考 Python 的基本數(shù)值運(yùn)算,你知道怎么算么?
打開 Python 自帶終端,一行代碼就能計(jì)算出結(jié)果:
mark
把原鏈接中的
?
0
替換為
?
274877906944
回車就會進(jìn)入下一關(guān):
mark
游戲這就正式開始了。圖片中的筆記本給了三組字母,很容易發(fā)現(xiàn)規(guī)律:前面的字母往后移動(dòng)兩位就是后面的字母。
那么需要做的就是根據(jù)這個(gè)規(guī)律把下面的提示字符串,做位移解密得到真正的句子含義:
這道題考察字符串編碼和 for 循環(huán)相關(guān)知識,代碼實(shí)現(xiàn)如下:
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)
得到結(jié)果:
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.
作者很風(fēng)趣,當(dāng)然不能手動(dòng)去一個(gè)推算了,推薦用 string.maketrans() 這個(gè)方法解決,我們上面采取的是比較直接的方法,官方給出了更為精簡的方法:
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 關(guān):
mark
作者接著說過關(guān)的提示可能在書里(當(dāng)然不可能了)也可能在網(wǎng)頁源代碼里。那就右鍵查看源代碼往下拉看到綠色區(qū)域,果然找到了問題:
mark
意思就是:要在下面這一大串字符里找到出現(xiàn)次數(shù)最少的幾個(gè)字符
考察了這么幾個(gè)知識點(diǎn):
-
正則表達(dá)式提取字符串
-
list 計(jì)數(shù)
-
條件語句
如果是你,你會怎么做?
來看下,十行代碼快速實(shí)現(xiàn):
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轉(zhuǎn)為str便于遍歷字符
6
str?=?
''
.join(text)
7
8
lst?=?[]
9
key=[]
10
#遍歷字符
11
for
?i?
in
?str:
12
????
#將字符存到list中
13
????lst.append(i)
14
????
#如果字符是唯一的,則添加進(jìn)key
15
????
if
?i?
not
?
in
?key:
16
????????key.append(i)
17
#?將list列表中的字符出現(xiàn)字?jǐn)?shù)統(tǒng)計(jì)出來
18
for
?items?
in
?key:
19
????print(items,lst.count(items))
首先,用 Requests 請求網(wǎng)頁然后用正則提取出字符串,接著 for 循環(huán)計(jì)算每個(gè)字符出現(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
18
e?
1
19
q?
1
20
u?
1
21
a?
1
22
l?
1
23
i?
1
24
t?
1
25
y?
1
可以看到出現(xiàn)次數(shù)最少的就是最后幾個(gè)字符,合起來是「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)作者弄了個(gè)小惡作劇,需要手動(dòng)輸入數(shù)值到 url 中然后回車,你以為這樣就完了么?并沒有它有會不斷重復(fù)彈出新的數(shù)值讓你輸入,貌似無窮盡。
所以,這一關(guān)肯定不能采取手動(dòng)輸入的方法闖關(guān),自然要用到 Python 了。要實(shí)現(xiàn)自動(dòng)填充修改 url 回車跳轉(zhuǎn)到新 url,循環(huán)直到網(wǎng)頁再也無法跳轉(zhuǎn)為止這一功能。
如果是你,你會怎么做?
其實(shí),一段簡單的爬蟲加正則就能搞定。思路很簡單,把每次網(wǎng)頁中的數(shù)值提取出來替換成新的 url 再請求網(wǎng)頁,循環(huán)下去,代碼實(shí)現(xiàn)如下:
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
#?計(jì)數(shù)器
10
count?=?
0
11
while
?
True
:
12
????
try
:
13
????????
#?提取下一頁動(dòng)態(tài)數(shù)值
14
????????nextid?=?re.search(
'\d+'
,?resp).group()
15
????????count?=?count?+?
1
16
????????nextid?=?int(nextid)
17
????
except
:
18
????????print(
'最后一個(gè)url為:%s'
?%?nexturl)
19
????????
break
20
21
????
#?獲取下一頁url
22
????nexturl?=?url?+?str(nextid)
23
????print(
'url?%s:%s'
?%?(count,?nexturl))
24
????
#?重復(fù)請求
25
????resp?=?requests.get(nexturl).text
輸出結(jié)果如下:
可以看到,最終循環(huán)了 85 次找到了最后一個(gè)數(shù)字16044,輸入到 url 中就闖關(guān)成功。
33 關(guān)既有趣又能鍛煉使用 Python 解決問題的技巧,感興趣的話去玩玩看。
網(wǎng)址: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科技大本營轉(zhuǎn)載文章,轉(zhuǎn)載請聯(lián)系原作者)
◆
CTA核心技術(shù)及應(yīng)用峰會
◆
5月25-27日,由中國IT社區(qū)CSDN與數(shù)字經(jīng)濟(jì)人才發(fā)展中心聯(lián)合主辦的第一屆CTA核心技術(shù)及應(yīng)用峰會將在杭州國際博覽中心隆重召開,峰會將圍繞人工智能領(lǐng)域,邀請技術(shù)領(lǐng)航者,與開發(fā)者共同探討機(jī)器學(xué)習(xí)和知識圖譜的前沿研究及應(yīng)用。 議程設(shè)置請請識別海報(bào)二維碼查看。
目前CTA峰會倒計(jì)時(shí)5天!還沒有拿到入場券的小伙伴可以掃描識別海報(bào)二維碼或者點(diǎn)擊閱讀原文,即刻搶購。你也 添加小助手微信 15101014297 ,備注“ CTA ”,了解票務(wù)以及會務(wù)詳情。
推薦閱讀
-
掌聲送給TensorFlow 2.0!用Keras搭建一個(gè)CNN | 入門教程
-
一文回顧AI繪畫的成長之路:從簡筆畫到真實(shí)人臉生成
-
清華AI學(xué)堂班:姚期智擔(dān)任首席教授,2019年首批招收30人
-
中國AI開發(fā)者真實(shí)現(xiàn)狀:寫代碼這條路,會走多久?
-
520 這天,我突然意識到,她根本配不上我這么聰明的男人
-
厲害!女學(xué)生偷師男子學(xué)校,變身區(qū)塊鏈開發(fā)工程師
-
確實(shí), 5G與物聯(lián)網(wǎng)離不開區(qū)塊鏈!
-
刷了一個(gè)半月算法題,我薪資終于Double了
-
Linux 之父:我就是覺得蘋果沒意思!| 人物志
-
這本京東斷貨王的Python神書,刷爆整個(gè)編程圈!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

