Python Challenge Level2
※ネタバレ有り
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にしてみたら・・・ビンゴ!
感想
ソースの中で解き方は指示されているので、簡単でした。