隠し要素

本編の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