ホームページ  >  記事  >  バックエンド開発  >  ゲームプレイを通じて Python の習熟度をテストします

ゲームプレイを通じて Python の習熟度をテストします

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-06-03 18:00:244081ブラウズ

最近、インターネット上で非常に興味深い Python ゲーム クリアランス Web サイトを見ました。レベルは全部で 33 あります。各レベルでは、Python の知識を使用して問題を解決し、答えを見つける必要があります。次のレベル。 Python の包括的な習熟度をテストします。たとえば、一部のレベルでは正規表現の使用が必要で、一部のレベルではクローラーの使用が必要です。

ゲームプレイを通じて Python の習熟度をテストします

私たちは通常、章順、パッケージ、またはモジュールで Python を学習しますが、学習後は忘れがちです。この Web サイトを使用して、Python の習熟度を包括的にテストし、ギャップを見つけて埋めることができます。

このウェブサイトのプレイ方法について話しましょう。

ゲームプレイを通じて Python の習熟度をテストします

こちらがこのサイトのメインページですが、10年以上前から存在している歴史を感じますね。ただし、アンティークっぽいからといって侮ってはいけません。

ゲームプレイを通じて Python の習熟度をテストします

楽しんでみましょう。「チャレンジする」をクリックしてチャレンジを開始してください。

レベル 0 は、ウォーミングアップ ウォームアップ セッションです:

このレベルの要件は、URL リンクを変更することであり、与えられるプロンプトはコンピューター上の数式です。 2 の 38 乗なので、おそらく値を計算し、URL を変更して次のレベルに入る必要があります。

このレベルは Python の基本的な数値演算のテストです。計算方法は知っていますか?

Python 独自のターミナルを開くと、1 行のコードで結果を計算できます:

ゲームプレイを通じて Python の習熟度をテストします

元のリンクの 0 を 274877906944 に置き換えて、Enter キーを押します。次のページに進むには レベル 1:

ゲームプレイを通じて Python の習熟度をテストします

#ゲームが正式に始まります。写真のノートには 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 レベルに到達します。 :

ゲームプレイを通じて Python の習熟度をテストします

著者はさらに、ゲームプレイを通じて Python の習熟度をテストします ヒントは本の中にあるかも知れません (もちろんそんなことはあり得ません)、あるいはソースコードの中にあるかもしれないと述べました。ウェブページ。次に、右クリックしてソース コードを表示し、下にスクロールして緑色の領域を確認します。案の定、問題が見つかりました:

ゲームプレイを通じて Python の習熟度をテストします

意味: 次の中で最も少ない文字を見つけてください。文字列

#いくつかのナレッジ ポイントを調査しました:

文字列を抽出するための正規表現

リストのカウント

条件文

もしあなただったら、どうしますか?

すぐに実装できる 10 行のコードを見てみましょう:

import requests
url = 'http://www.pythonchallenge.com/pc/def/ocr.html'
res = requests.get(url).text
text = re.findall(&#39;.*?<!--.*-->.*<!--(.*)-->&#39;,res,re.S)
# list转为str便于遍历字符
str = &#39;&#39;.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 を使用して Web ページをリクエストし、次に正規表現を使用して文字列を抽出し、次に 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

最後の数文字が最も出現頻度が低く、これらを合わせて「等しい」ことがわかります。URL 文字を置き換えることで、2 番目のレベルに合格し、次のレベルに進んでチャレンジを続けることができます。面白くないですか?

後続の各レベルでは、レベル 4 など、関連する Python スキルを使用して解決する必要があります。

ゲームプレイを通じて Python の習熟度をテストします

このレベルの作成者は、ちょっとしたいたずらをしました。 URL に値を手動で入力して Enter キーを押す必要があります。これで終わりだと思いますか?新しい値が常に出現し、無限に入力できるように見えるわけではありません。

ゲームプレイを通じて Python の習熟度をテストします

所以,这一关肯定不能采取手动输入的方法闯关,自然要用到 Python 了。要实现自动填充修改 url 回车跳转到新 url,循环直到网页再也无法跳转为止这一功能。

如果是你,你会怎么做?

其实,一段简单的爬虫加正则就能搞定。思路很简单,把每次网页中的数值提取出来替换成新的 url 再请求网页,循环下去,代码实现如下:

import requests
import re
import os
# 首页url
resp = requests.get(
   &#39;http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345&#39;).text
    url = &#39;http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=&#39;
# 计数器
count = 0
while True:
   try:
    # 提取下一页动态数值
       nextid = re.search(&#39;\d+&#39;, resp).group()
       count = count + 1
       nextid = int(nextid)
    except:
       print(&#39;最后一个url为:%s&#39; % nexturl)
       break
    # 获取下一页url
    nexturl = url + str(nextid)
    print(&#39;url %s:%s&#39; % (count, nexturl))
    # 重复请求
    resp = requests.get(nexturl).text

输出结果如下:

ゲームプレイを通じて Python の習熟度をテストします

可以看到,最终循环了 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。