ICFP 2007

昨日までの三日間、色々と失いながらもやっていたのを、一晩寝かせてから書いておこうかなぁと。去年はまずまず順調だったけれど、今年はやや微妙気味。出遅れたのが一番致命的だったし、やり残した感が強過ぎる。何よりもアルゴリズムとかデータ構造っていうのが一番大事なんだなぁというのを改めて痛感させられたなぁと。


今回は自称DNAのプログラムを渡されて、それにパッチを当てて、目的のプログラムに近付けるというもの。自称DNAなのでATGCならぬICFPの四文字から構成されているので、読みにくくて仕方がない。終わる頃にはある程度読めるようにはなっていたけれど、なんとも。


ICFPの四文字からなるというのはかなりポイントで、普通のプログラムにくらべると情報量が非常に無駄に使われている。だからと言って2ビットに変換するなんてことはなくて、ここで重要になるのは、とても大きなテキストを適切に扱うデータ構造。これだけで2日くらい消える時には消えるというか、自分にはそんなものは分からないというか。(分かる人には一瞬で、数時間もあればかなり高速なものができるそうで。)


大体1日くらいでなんとか漠然としたものが見えてきて、プログラムの中身の仕様書みたいなのを漠然と渡された状態でブラックテスト状態になりながら、ひたすらハッキング。関数の呼び出しをバイナリから探す、なんてことは生まれて初めてやった気がする。その上呼び出し規約から、呼び出す関数を別のにするなんて、できるんだろうなぁと思っても日常的にやる作業じゃあないなぁと。(この辺は最終日の終了間際に始めたことで、余り時間はかけられなかったけれども。)


一番惜しむべきは、個々の関数が色々な関数を呼び出していて、一番下のレベルの関数で色々な処理をしているんだと信じていたことで、その際にややグローバルな変数を参照していたりするんだろうと思い込んでいたこと。何が言いたいかというとある関数で描画色を指定しているようなんだけれど、色を変更する関数が複数あって、そのどれも呼ばれていないし、グローバル変数にもアクセスしている節がないなぁと、延々と探したけれど、見付からなかったということ。実際にはその関数自体で、色指定をアセンブリのようなレベルでやっていたらしい。これだけでスコアが天と地ほど違う...。


結論から言うと、今年は去年よりも頭を使うというよりは、知識を要求されるという感じだったと思う。力技でさっくり実装するのも一つの手だろうけれど、適切なデータ構造を知識として持っていることは非常に重要だし、バイナリのハッキングなんて既存知識の温床だと思う。そういうのなしに初めてやったにしては上出来なんだろうけれど、なんともやり残した悔しさが残って仕方がない...。来年こそは...。


というか、来年は去年と同じメンバーでやりたいなぁ。4年前は一人でもなんとかそれなりのものになったというか、1日で飽きたというかだったけれど、その後二回は一人では力技を求められる部分で力尽きて飽きてしまった。去年はまずまずだったし、今年も去年のチームが二つに分かれたわけだけど、両方ともそこそこの順位には入っている。チーム全員がほとんど別の方向を向いているメンバーなのは、非常にいいと思うし、時間さえあればもっと上を狙えるんじゃないかなぁと。(ひたすら処理系の高速化に命かける人間がいてくれれば、それだけやってくれるんでも問題ないと思うし、自分はそんなことはしたくない。)


取り敢えずおもしろい内容ではあるので、力技に自信がある人、知識に自信がある人は今からでもやってみてはいかがでしょう。(できないかも知れないけれども。)