「Rubyist Magazine へのたより」の解説

ref: http://jp.rubyist.net/magazine/?0027-Comments#l12
というのを書いてみました。ruby 1.6.8 、1.8.2 、1.8.7 、1.9.1 、trunk で動作確認しています。


#!/usr/bin/env ruby

"cFkEAVkIgFhAQIBZgZx2dp
TtM44M6CUpSUlSlKWBKYpSlJSVK
UpGEpcZJ0dnTtMlwMlYEF0IDg8IWwSA
AQSAW24wHG5bBJWAJJBbSUCESVsGk4eWkFk
CX0AAB3OUTM52kGZYlKVFaYlJCUAACUpSkIaUYJ
RYdKUQ6cdEBkA8BAEAIiABiABCIEAAI2BZBCKXJTsqc
53rjEPJSlYiqUpEpWQklJkaKpOkilACJ3kXMqcJ
3qTkWGBYB1oB".split.join.unpack("m"
)[0 ].gsub(/[W-_]/){"\000"*($&.
unpack("C")[0]-86)}.unpack(
"C*" ).map{|p,q|"%08b"%
p}.join.tr("01"," #
x").scan(/.{7#{
6}}/).map{|
l|puts\
l}# (c) Y.Endoh, 2009

インデントをまともにするとこんな感じ。

"cFkEAVkIgFhAQIBZgZx2dpTtM44M6CUpSUlSlKWBKYpSlJSVKUpGEpcZJ0dnTtMlwMlY
EF0IDg8IWwSAAQSAW24wHG5bBJWAJJBbSUCESVsGk4eWkFkCX0AAB3OUTM52kGZYlKVFa
YlJCUAACUpSkIaUYJRYdKUQ6cdEBkA8BAEAIiABiABCIEAAI2BZBCKXJTsqc53rjEPJSl
YiqUpEpWQklJkaKpOkilACJ3kXMqcJ3qTkWGBYB1oB".
split.join.
unpack("m")[0].
gsub(/[W-_]/){"\000"*($&.unpack("C")[0]-86)}.
unpack("C*").
map{|p,q|"%08b"%p}.
join.
tr("01"," #\n             x").
scan(/.{7#{6}}/).
map{|l|puts l}
# (c) Y.Endoh, 2009

全部メソッドチェインでつながっています。最初の文字列がビットマップを 0 だけランレングス圧縮+ Base64エンコードしたデータで、後半はそれのデコードです。

split.join.

↑文字列から空白を除去します。1.8.7 と 1.9 なら不要でしたが 1.6.8 や古い 1.8 では必要だったので入れています。

unpack("m")[0].

Base64 デコードをします。

gsub(/[W-_]/){"\000"*($&.unpack("C")[0]-86)}.

↑ランレングス圧縮のデコードです。ASCII で 87 - 95 は、それぞれ 0 が (n-86) 個続くことを表します。この範囲を選んだのは、この間のビットパターンがたまたま元データ中に現れなかったから。"\000" は "\0" だけでいいですが、横幅を合わせるためになんとなくそうしてます (別にゴルフじゃないのでいいのです) 。$&.unpack("C")[0] は String#ord の代わり (古い処理系には String#ord がないため) 。

unpack("C*").

↑8 bit ごとの整数の配列にして。

map{|p,q|"%08b"%p}.

↑2 進表記にして (,q の部分は不要。これも横幅を合わせるため)

join.

↑ひとつの文字列につないで

tr("01"," #\n             x").

↑0 を空白に、1 を # に変換して

scan(/.{7#{6}}/).

↑76 文字ごとに区切って

map{|l|puts l}

↑各行を出力する。

# (c) Y.Endoh, 2009

こういう無茶なコードでもわりと簡単に読めるのが Ruby のいいとこですよね。んで実行結果。


### # #
# # # # #
# ## ### ### ## ### ## # # # ### ## # ## ### ### ## ###
# # # # # # # # # # # # # # # # # # # # # # ## # # # #
# # # # # # # # # # # # # # # # # # # # # # # ## # # # #
### ## # # ### # ### ## ### # ### ## # ## # # ### ## # #
#
# ### #### #
# # # # #
## ### ## ### ## ###
# # # # ## # # # #
# # # # # # # # #
## # # ### #### # ## # # #
#
### ### ### # # # ## ## ### ### ## # # ## ##
# # # # # # # # # # ## # ## # # # # # # # #
# # # # # # # # # # # ## # # # ## # # #
### # # # # # # ### # ### ### # # ## #
#### # # # # # ## # #
# # # # ## ## #
# # # # ### # # # ### ## # # # ### ### ### #### # ### ## #
#### # # # # # # # ## # # # # # # # # # # # # # # # ## #
# # # # # # ## # ## # # # # # # ### # # # # # # #
# # ### #### # # ### ## # # # ### # ### #### # # # ### #
## ###
あんまりひねりはなかったですね。