Python Challenge Level5
※ネタバレ有り
考え方
タイトルは「peak hell」。地獄の頂上?
画像は丘っぽいので、peakは丘のことなんでしょうか。地獄の丘?
うーんよくわからない。
画像下に「pronounce it」と書かれています。「それを発音しなさい」?どれのことだ?
とりあえずソースを開けば何とかなると思って開いてみます。
・・・なんか今までと違ってそれっぽいものがないような・・・・
でも最後に
<!-- peak hell sounds familiar ? -->
と書かれていますね。「peak hell と似た言葉は?」
ぴーくへる、ぴーくへる、ぴーくへる・・・・ 似た言葉???
あと、このコメントの少し上に
<peakhell src="banner.p"/>
というあからさまに怪しいタグとファイルがありますね。
このbanner.pというファイルをダウンロードして、中身を覗いてみたら何かわかるかも知れません。
エディタで開いてみました。
banner.p
(lp0 (lp1 (S' ' p2 I95 tp3 以下略
わかんねえ!バイナリエディタで開いてみたけどわかんね!
何か法則性があるのかと思ってよく見てもやっぱりわかりません。ここで行き詰まる。
助けて!ぐーぐる先生!
・・・
あー!どうやら"peak hell"って"pickle"のことらしい。ぴーくへる→ぴくるはちょっと無理がある気がするけど・・・
pickle.loadでごにょごにょするらしいので、色々やってみる。
>>> import pickle >>> o = pickle.load(open("banner.p")) # banner.pはあらかじめ保存しておく >>> o [[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)],...以下略
banner.pをpickle.loadしてとりあえず表示。うーん、またよくわからない・・・
パッと見でわかるのは、
- リスト構造になってる
- リストの中にリストが入ってる
- そのリスト内にタプルが何個か入ってる
ということかな。
もう少し整形して出力してみようか。
>>> for i in o: ... print i ... [(' ', 95)] [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)] [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)] [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)] [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)] [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)] 以下略
ん?なんかそれっぽくなってきた?
タプルが「文字と数字の組み合わせ」になっているので、もしかして「文字を数字の回数表示しろ」という意味に読み取れるぞ!
早速やってみよう。
回答
#!/usr/bin/env python #! -*- coding: utf-8 -*- """ level 5 http://www.pythonchallenge.com/pc/def/peak.html """ import pickle import sys import urllib url = "http://www.pythonchallenge.com/pc/def/banner.p" urllib.urlretrieve(url, "banner.p") # banner.pを取得 o = pickle.load(open("banner.p")) for i in o: for j in i: sys.stdout.write(j[0] * j[1]) print ""
実行結果
$ python level5.py ##### ##### #### #### #### #### #### #### #### #### #### #### #### #### #### #### ### #### ### ### ##### ### ##### ### ### #### ### ## #### ####### ## ### #### ####### #### ####### ### ### #### ### ### ##### #### ### #### ##### #### ##### #### ### ### #### ### #### #### ### ### #### #### #### #### ### #### #### ### #### #### ### #### #### #### #### ### ### #### #### #### #### ## ### #### #### #### #### #### ### #### #### #### #### ########## #### #### #### #### ############## #### #### #### #### ### #### #### #### #### #### #### #### #### #### #### #### ### #### #### #### #### #### #### ### #### #### #### ### #### #### #### #### ### #### ### ## #### #### ### #### #### #### #### #### ### ## #### ### ## #### #### ########### #### #### #### #### ### ## #### ### ###### ##### ## #### ###### ########### ##### ### ######
うおーナニコレ!かっこいい!!
こいつをURLに貼り付けて・・・できた!!!!
感想
そろそろ自力で解ききるのがきつくなってきた><
pickleは入門書を読んでても「ふーん」という感じだったので、この問題でまた勉強する機会になりました。・・・けどやっぱり使いどころがイマイチわからない><
追記
pickleは「オブジェクト」をファイルに保存できるのか!
リストや辞書構造を含むオブジェクトをpickle化しておけば、どのモジュールからでもデータ構造をそのまま引っ張ってこれる!これは便利だ!
テキストに要素をスペースで区切って書き出した場合、次に読み込む時は順番に「最初の要素をリストに入れて、次の要素を辞書のキーにして・・・」なんて面倒なことをしないといけないけど、pickle化してファイルに書き出せばデータ構造もそのまま保存できるんですね。ははぁ、こりゃ便利だ。
更に追記
ちょっとひねくれた書き方もしてみたくて、こんな風に書けばほとんど2行で終わるんじゃねと思ったんだけど、うまく動かない><
#!/usr/bin/env python #! -*- coding: utf-8 -*- import pickle import urllib o = pickle.load(urllib.urlopen("http://www.pythonchallenge.com/pc/def/banner.p")) print "".join([j[0]*j[1] for i in o for j in i])
実行結果
$ python level5.py ##### ##### #### #### #### #### #### #### #### #### #### #### #### #### #### #### ### #### ### ### ##### ### ##### ### ### #### ### ## #### ####### ## ### #### ####### #### ####### ### ### #### ### ### ##### #### ### #### ##### #### ##### #### ### ### #### ### #### #### ### ### #### #### #### #### ### #### #### ### #### #### ### #### #### #### #### ### ### #### #### #### #### ## ### #### #### #### #### #### ### #### #### #### #### ########## #### #### #### #### ############## #### #### #### #### ### #### #### #### #### #### #### #### #### #### #### #### ### #### #### #### #### #### #### ### #### #### #### ### #### #### #### #### ### #### ### ## #### #### ### #### #### #### #### #### ### ## #### ### ## #### #### ########### #### #### #### #### ### ## #### ### ###### ##### ## #### ###### ########### ##### ### ######
改行がされないんだよなぁ。iの値が更新される時に改行を入力したいんだけど、やり方がわからない。