隠し要素
本編のDNA処理は難しそうなので、こっちの隠し要素の方をやってみる。
横幅 16 カラムで DNA を見ると "ACHTUNG! PORTABLE NETWORK GRAPHICS FOLLOWS" というメッセージがアスキーアートで現れる
http://d.hatena.ne.jp/ku-ma-me/20070723/p2#tb
アスキーアート編
単純に16カラムで折り返すと左右に切れた状態になるので8文字ずらして調整する。
実際に出てくるのはけっこう後の方なのでそこまでtailで読み飛ばす。
% wget http://www.icfpcontest.org/endo.zip % unzip endo.zip % tail -c +8 endo.dna | fold -w 16 | cat -n | tail -n +999 | head 999 CCCCCCCCCCCCCCCC 1000 CCCCCCIIIICCCCCC 1001 CCCCCCIIIICCCCCC 1002 CCCCIICCCCIICCCC 1003 CCCCIICCCCIICCCC 1004 CCIICCCCCCCCIICC 1005 CCIICCCCCCCCIICC 1006 CCIIIIIIIIIIIICC 1007 CCIIIIIIIIIIIICC 1008 CCIICCCCCCCCIICC
というわけで、これを読んでいくと、
ACHTUNG! PORTABLE NETWORK GRAPHICS FOLLOWS
イメージ(PNG)編
しばらくCだけが続いた後でPがぽつんと出たところがデータの始まりっぽい。
Pの1文字分だけずれるので、最初のtailで9文字飛ばした。
また、データの終わりもPになっているようだ。
サイズ的にいって音声データはpngに埋め込まれているわけではなくて、単にその次のP〜Pの間のデータがそうみたいだ。
% tail -c +9 endo.dna | fold -w 8 | cat -n | tail -n +3464 | head -n 5 3464 CCCCCCCC 3465 CCCCCCCC 3466 CCCCCCCP 3467 CIICIIIC 3468 IIIICICI % tail -c +9 endo.dna | fold -w 8 | cat -n | tail -n +3464 | grep P | head -n 3 3466 CCCCCCCP 3690 PPCCCCCC 27954 CIPIFPFC
1個目のデータを取り出す。
CIICIIICがpngのヘッダの先頭バイト=0x89=0b10001001になるとしたら、Cが1、Iが0で下位ビットから上位ビットの順になっているはず。
% tail -c +9 endo.dna | fold -w 8 | tail -n +3467 | head -n $((3690-3467)) | tr IC 01 | ruby -pe '$_=[chop].pack("b*")' > endo.png % od -a -N 8 endo.png 0000000 ht P N G cr nl sub nl
というわけで、これをビューワで見ると
Human audio follows:
オーディオ(mp3)編
2個目のデータを取り出す。
今回はPP分の2文字を加えた最初11文字を飛ばす。
んー、こっちのヘッダはよくわからん。RIFFとか書いてあるわけじゃないのか。
% tail -c +11 endo.dna | fold -w 8 | tail -n +3690 | tr IC 01 | head -n $((27954-3690)) | ruby -pe '$_=[chop].pack("b*")' > endo.mp3 % od -a -N 8 endo.mp3 0000000 del s ( D nul vt ) b