相変わらずPython Challengeを解いていきます。ネタバレするのでこれからPython Challengeをやろうと思っている人は見ないでください。
level 1
ページを開いてみるとノートに書かれた謎の対応表が出てきます。
キャプションには、"everybody thinks twice before solving this."、これを解く前に2回考えろ、という謎のヒント。さらにその下には、
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.
という謎の文字列。これを解けということか。
単純に思いつくのはシーザー暗号ですね。実際、
K -> M
O -> Q
E -> G
これらはちょうどアルファベット順で2文字ずらしたものになっています。KLM, OPQ, EFGしかり。
いろいろ試行錯誤もしたのですが、結果だけ載せると
# !/usr/bin/env python3
ss = "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."
ts = ""
initord = ord('a')
for s in ss:
if s.isalpha():
ts = ts + chr(((ord(s)-initord)+2)%26 + initord)
else:
ts = ts + s
print(ts)
その結果は
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がおすすめだ、urlにシーザー暗号を適用しろという内容です。
まず前者のstring.maketransがおすすめということなので、使って書き直してみました。maketransの使い方はhelpを参照してください。
# !/usr/bin/env python3
ss = "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."
import string
base = string.ascii_lowercase
trans = base[2:] + base[:2]
table = str.maketrans(base,trans)
print(ss.translate(table))
確かにやたら簡潔に書くことができるようになりました。
そして後者は、これをURLに適用しろということでしたね。実際やってみると、
print("map".translate(table))
その結果は
ocr
となりました。つまりURLをmap -> ocrに書き換えろということですね。
level 2
次への扉がひらかれました。mapといいつつmap関数は使いませんでしたね。
http://www.pythonchallenge.com/pc/def/ocr.html