最近、インターネット上で非常に興味深い Python ゲーム クリアランス Web サイトを見ました。レベルは全部で 33 あります。各レベルでは、Python の知識を使用して問題を解決し、答えを見つける必要があります。次のレベル。 Python の包括的な習熟度をテストします。たとえば、一部のレベルでは正規表現の使用が必要で、一部のレベルではクローラーの使用が必要です。
私たちは通常、章順、パッケージ、またはモジュールで Python を学習しますが、学習後は忘れがちです。この Web サイトを使用して、Python の習熟度を包括的にテストし、ギャップを見つけて埋めることができます。
このウェブサイトのプレイ方法について話しましょう。
こちらがこのサイトのメインページですが、10年以上前から存在している歴史を感じますね。ただし、アンティークっぽいからといって侮ってはいけません。
楽しんでみましょう。「チャレンジする」をクリックしてチャレンジを開始してください。
レベル 0 は、ウォーミングアップ ウォームアップ セッションです:
このレベルの要件は、URL リンクを変更することであり、与えられるプロンプトはコンピューター上の数式です。 2 の 38 乗なので、おそらく値を計算し、URL を変更して次のレベルに入る必要があります。
このレベルは Python の基本的な数値演算のテストです。計算方法は知っていますか?
Python 独自のターミナルを開くと、1 行のコードで結果を計算できます:
元のリンクの 0 を 274877906944 に置き換えて、Enter キーを押します。次のページに進むには レベル 1:
#ゲームが正式に始まります。写真のノートには 3 つのグループの文字が示されており、前の文字が 2 つ後ろに移動して後ろの文字になるというパターンを見つけるのは簡単です。
次に、行う必要があるのは、このルールに従って次のプロンプト文字列を復号化し、ディスプレイスメント復号化を実行して実際の文の意味を取得することです。
この質問では、文字列のエンコードと文字列に関する知識を調べます。 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.
作者は非常に興味深いです。もちろん、手動で計算することはできません。文字列を使用することをお勧めします。 maketrans() を使用してそれを解決します。上で採用したものはより直接的な方法ですが、公式ではより合理化された方法が提供されています:
import string l = string.lowercase t = string.maketrans(l, l[2:] + l[:2]) print (text.translate(t))
次に、URL 内のマップを ocr に変更し、Enter キーを押して第 2 レベルに到達します。 :
著者はさらに、 ヒントは本の中にあるかも知れません (もちろんそんなことはあり得ません)、あるいはソースコードの中にあるかもしれないと述べました。ウェブページ。次に、右クリックしてソース コードを表示し、下にスクロールして緑色の領域を確認します。案の定、問題が見つかりました:
意味: 次の中で最も少ない文字を見つけてください。文字列
もしあなただったら、どうしますか? すぐに実装できる 10 行のコードを見てみましょう:
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))
% 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
所以,这一关肯定不能采取手动输入的方法闯关,自然要用到 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/
以上がゲームプレイを通じて Python の習熟度をテストしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。