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 のいいとこですよね。んで実行結果。
あんまりひねりはなかったですね。
### # #
# # # # #
# ## ### ### ## ### ## # # # ### ## # ## ### ### ## ###
# # # # # # # # # # # # # # # # # # # # # # ## # # # #
# # # # # # # # # # # # # # # # # # # # # # # ## # # # #
### ## # # ### # ### ## ### # ### ## # ## # # ### ## # #
#
# ### #### #
# # # # #
## ### ## ### ## ###
# # # # ## # # # #
# # # # # # # # #
## # # ### #### # ## # # #
#
### ### ### # # # ## ## ### ### ## # # ## ##
# # # # # # # # # # ## # ## # # # # # # # #
# # # # # # # # # # # ## # # # ## # # #
### # # # # # # ### # ### ### # # ## #
#### # # # # # ## # #
# # # # ## ## #
# # # # ### # # # ### ## # # # ### ### ### #### # ### ## #
#### # # # # # # # ## # # # # # # # # # # # # # # # ## #
# # # # # # ## # ## # # # # # # ### # # # # # # #
# # ### #### # # ### ## # # # ### # ### #### # # # ### #
## ###