ICFP Programming Contest 2007

去年はumixだったが、今年はDNAだったらしい。

課題
http://www.icfpcontest.org/Endo.pdf
Endo's DNA
http://www.icfpcontest.org/endo.zip
元になる画
http://www.icfpcontest.org/source.png
目指す画
http://www.icfpcontest.org/target.png

以下ネタバレページ。

endo.dnaというバイナリと、それを実行するための方法が与えられるので、そのバイナリにprefixをつけてtarget.pngにできるだけ近い画像を生成しなさい、というもの。
塩基がICFPなのが面白い。
DNAのデータ構造は、このときは深く考えてなかったけど、なんだかマニュアルに載っている演算子の記号と、Data.Sequenceの記号が似ていたので、これを使うといいのかなと思ってData.Sequenceを用いた。Data.SequenceというのはFinger TreeのHaskellにおける実装で、結果的にこれを選んだのは大正解なのであったが、このときはまだそのことに気づいていない。

http://d.hatena.ne.jp/tanakh/20070725

DNAの表現に Seq Char を使う版 (version 4)
sakaiさんが Data.Sequence モジュールを使って実装したものを他のバー ジョンと同じ形式にすこし改変(本質的な部分はまったく同じ).endo.dna を 全部処理してもたった
80秒 爆速!!!
前バージョンの540倍!!!はっきりいってびっくらこいた.270行ほどのプログ ラムでこれだけ速いのはすごい気がする.

http://www.sampou.org/cgi-bin/haskell.cgi?ICFP2007%3Aexecute

RNAインタプリタの要所要所で途中画像をダンプするようにしてみたら、最初の1000命令くらいで DNA文字列っぽい画像が描かれてすぐ黒塗りで消されているのを発見。 早速実行してみたら新たな画像が。
"FUUN FIELD REPAIR GUIDE"。与えられたDNAの使い方が描いてあるマニュアルらしい。これが手がかりか! さらに「マニュアルのページを取り出すDNAコード」と「周りが暗くて困ったときのDNAコード」が書いてある。 すげー。これでやっと去年で言うumixにログインできた状態か。スタート遠すぎだろ!!
マニュアルのページは、"FUUN FIELD REPAIR GUIDE" を得たコード IIPIFFCPICFPPICIICCIICIPPPFIIC を書き換えたコードを実行することで得られる。右のFをページ数の2進数表記(F=1,C=0,例えばpage.4ならCCF)で置き換え、左の Cは同じ個数のCで置き換える(page.4ならCCC) で置き換えるよろし。
DNA は RedZone, GreenZone, BlueZone の3つに分かれている。
(要は、この DNA は1つの計算機環境で、 RedZoneはコードを実行するための作業場、GreenZoneは関数&グローバル変数、 BlueZoneはスタック&ヒープ、である!!)

http://www.kmonos.net/wlog/75.html#_2341070724

Greenbear Laboratory - ICFP contest 2007 感想リンク集
ICFP contest 2007の感想リンク集です。

http://mono.kmc.gr.jp/~yhara/w/?ICFP2007Links