The Python Challenge(retry)

よし解けた。Pythonリファレンス初読開始から30分。

レベル5

http://www.pythonchallenge.com/pc/def/peak.html

Pythonチュートリアルの2〜3章を流し読みした後、設問の意味を解読することから開始。
peak hellをPronounceすると……pickel? かなあ。と思って検索してみたらDid you mean: Pickle とヒントをもらえたので(好きだぜ、Google先生!!)、
3.14 pickle -- Python object serialization
に辿り着く。
Pythonのオブジェクトをシリアライズするライブラリだ。
シリアライズ=長期保存=漬物? でピクルスなんだろうね。
Pickle/Unpickleの説明と、使用コードを探し、模倣(インスパイヤ)。設問のHTMLソースの中にbanner.pというファイル名があるのでそれをローカルにDLし、Unpickleにかけ、紆余曲折の末にbanner.pをデシリアライズする。ここまでで約10〜15分。


>>> from cPickle import Pickler, Unpickler
>>> up = Unpickler(open("F:\\banner.p",'r'))
>>> arr = up.load()
>>> print arr
[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)], [(' ', 15), ('#', 4), (' ', 71), ('#', 4), (' ', 1)],(以下略)
ドカドカ吐き出されたデータ構造を観察する。
どうもタプルの2次元配列が入っているらしい。
banner.pだから2次元に展開すると絵(Ascii Art)だ。
タプルの中身を見ると第0項*1は'#'か' 'の2種類しかない。これは絵の要素になる。第1項の数値。これは横軸だ。その証拠にタプルの第1項をリスト1つ分だけ総和すると、各リストについて95ずつになる。すなわち横95バイトの絵になるというのは容易に見当がつく。
ここまでで20分ちょい。

さて、これを2次元に展開するにはfor文とリストの使い方が分かればいい。
10分程度でざっくりリファレンスの当たりをつけ、完成。

解答はchannel。ということで、次なる設問はhttp://www.pythonchallenge.com/pc/def/channel.htmlだ。

人間はちょっとした知恵と検索力があれば情報社会を生き抜いていけるんだなあ。

Pythonシリアライズ機能に特化した本設問は、純粋にプログラミングを楽しむゲームとしてはいまいち。だから前回ノリ気がしなかったのだが、本来の主旨はPythonを楽しむゲームなのでいいということだ。


>>> for i in arr:
str = ""
for j in i:
str += j[0] * j[1]
print str


##### #####
#### ####
#### ####
#### ####
#### ####
#### ####
#### ####
#### ####
### #### ### ### ##### ### ##### ### ### ####
### ## #### ####### ## ### #### ####### #### ####### ### ### ####
### ### ##### #### ### #### ##### #### ##### #### ### ### ####
### #### #### ### ### #### #### #### #### ### #### ####
### #### #### ### #### #### #### #### ### ### ####
#### #### #### ## ### #### #### #### #### #### ### ####
#### #### #### ########## #### #### #### #### ############## ####
#### #### #### ### #### #### #### #### #### #### ####
#### #### #### #### ### #### #### #### #### #### ####
### #### #### #### ### #### #### #### #### ### ####
### ## #### #### ### #### #### #### #### #### ### ## ####
### ## #### #### ########### #### #### #### #### ### ## ####
### ###### ##### ## #### ###### ########### ##### ### ######

Python言語は文法規則としてインデントを厳格に強制する。そのためコードの見栄えは誰が書いてもほとんど同じだが、その代わりワンライナー的な用途は完全に切り捨てた。Perlと(また、Rubyとは結果的にだが)競合しない道を選んでいるのだ。

*1:正しいPythonの用語から逸脱しているかも……。おいおい調べて正確な記述に近づけます。