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

はてブロ@ama-ch

https://twitter.com/ama_ch

Python Challenge Level5

Python Challenge

※ネタバレ有り

考え方

タイトルは「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の値が更新される時に改行を入力したいんだけど、やり方がわからない。