読者です 読者をやめる 読者になる 読者になる

はてブロ@ama-ch

https://twitter.com/ama_ch

Python Challenge Level2

Python Challenge

※ネタバレ有り


Python Challengeのレベル2に挑戦!

考え方

画像はぼんやりとした本の写真。ひとまず画像下の説明を読む。

recognize the characters. maybe they are in the book,
but MAYBE they are in the page source.

和訳

文字を認識してください。それは本の中かも知れませんが、
たぶんページソースの中でしょう。

ソースを見ろということか!


ソースを開くと、最後の方に

<!--
find rare characters in the mess below:
-->

<!--
%%$@_$^__#)^)&!_+]!*@&^}@[@%]()%+$&[(_@%+%$*^@$^!+]!&_#)_*}{}}!}_]$[%}@[{_@#_^{*
@##&{#&{&)*%(]{{([*}@[@&]+!!*{)!}{%+{))])[!^})+)$]#{*+^((@^@}$[**$&^{$!@#$%)!@(&
以下略

このような記述が。あと謎の記号だらけの文字列がずら〜〜〜〜っと書いてあります。
「下のメチャクチャなとこから珍しい文字を見つけなさい:」
おお、丁寧に指示してくれてる。


ひとまず、この文字列をコピーしてきて、level2-source.txtなどの名前で保存します。


それではこのファイルを読み込んで、文字の出現頻度を調べてみましょう。

#!/usr/bin/env python
#! -*- coding: utf-8 -*-
""" level 2
http://www.pythonchallenge.com/pc/def/ocr.html
"""
f = open("level2-source.txt")

# 文字を辞書のキーとしてカウントする
dic = {}
for char in f.read().replace("\n", ""):
    if char in dic:
        dic[char] += 1
    else:
        dic[char] = 1
f.close()

for i in dic.keys():
    print i, dic[i]

実行結果

! 6079
# 6115
% 6104
$ 6046
& 6043
) 6186
( 6154
+ 6066
* 6034
@ 6157
[ 6108
] 6152
_ 6112
^ 6030
a 1
e 1
i 1
l 1
q 1
u 1
t 1
y 1
{ 6046
} 6105

アルファベットが1文字ずつ含まれていることがわかりました!
これを並べたものが答えになりそうな予感がします。
ですが、ディクショナリはキーの順序を保持しないので、どの順番でアルファベットが出現したかはわかりません。

回答

#!/usr/bin/env python
#! -*- coding: utf-8 -*-
""" level 2
http://www.pythonchallenge.com/pc/def/ocr.html
"""
import re
f = open("level2-source.txt")

# 小文字のアルファベットがいくつか1文字だけあることが
# わかったので、抽出して表示する
ans = re.findall("[a-z]", f.read())
print "".join(ans)

なんかとってもシンプルだw
実行結果

$ python level2.py
equality

おー出た!これをURLにしてみたら・・・ビンゴ!

感想

ソースの中で解き方は指示されているので、簡単でした。