コンテストまとめ

ushさん(id:ushioda)と二人でチームush(Unknown?)として参加してました。最後にTop15に滑り込んだけど大したスコアは出してません。

今回はリバースエンジニアリング大会だったのですね。
その意図に気づかずに、何かヒントがあるはずだとずっと探していてはまりました。うーん、なんだかなあ。

以下、72時間の流れ。

20日 19時
スタート。問題文が22ページとかあったりして早速にょろーんとする。でも仕方ないので読むと、どうやら提供されたendo.dnaを実行するための処理系の定義がされているらしい。ふたりでDNA->RNA, RNA->Fuunの処理系を書き始める。
20日 22時
自分が担当したRNAはいったん完成(この時点ではバグバグだったけどRNAがないとデバッグできない)。DNA->RNAがまだできていなくてやることが無かったので、自分も後追いで書き始めてみる。
21日 2時
DNA->RNAが出来てデバッグが出来たので、さっそく実行してみる。最初の部分でなにか画像が出ることがわかったので、そこを見ると何かDNA列が見える。それを先頭にくっつけて実行開始。今度はなんか画像きたー!2つめの方のDNA列をとりあえずsubmitし、1つ目のDNA列をクラスタに投げて、ぼくはとりあえず家に帰って仮眠。
21日 10時
画像が生成されていたので、1337をどうするか考える。が、わからない。とりあえず現状のDNA->RNAは遅くて、本質的にprotect(0)がやばいことが分かったので、それを解決すべくちゃんとしたデータ構造のインタプリタをスクラッチから書き始める。
21日 15時
とりあえずインタプリタがだいたい完成したので、ushさんに後を託して、ちょうどICFPと被っていた某ライブイベントへ。
21日 18時
さく->きゅ->PB->ね->CMSの5連続コンボで死亡する。
21日 22時
前線に復帰。作ったインタプリタは1時間で動いたらしい。しかしまだまだ遅いので最適化を開始。ushさんは一旦家に帰る。
22日 4時
最適化を重ねて、ついにインタプリタが10分ほどで動くようになる。
22日 7時
1337の謎がようやく解ける。DNA列に1337-1024の列が入っていたのは相当意地の悪い釣りだったらしい。
22日 13時
indexにあった全てのページを生成完了。ushさんが帰還。生成されたページを読んでendo.dnaの大まかな構造が分かったが、次に何をすればいいのかわからなくて途方にくれる。
22日 18時
本当に進展がないので、brute forceでページを生成しまくる。エラーページをヒューリスティックに早期検出するようなコードを追加して、3ページ/秒くらいでチェックできるようにして、クラスタを6台ほど使ってひたすら生成。
23日 0時
いくつかページが出てくるが、本質的なヒントはなし。コンテストが始まってからというものの、途方にくれるばかり。
23日 5時
関数テーブルが1ページ目しか持っていなかったので、とりあえずapple関数の色を書き換えてりんごの色を緑に変更。prefix length 28を脱出。
23日 8時
大学の期末試験に出席。結果は聞かないでください。
23日 12時
試験が終わって帰ってくると、ushさんが関数ライブラリのリバースエンジニアリングをして、関数っぽい場所を呼びまくって大量に画像を生成していた。GJ!!!
23日 15時
右下のカーゴの色を変えることに成功。
23日 17時
関数をretでうめてオブジェクトの消去をすることが出来るようになったので、とりあえずオブジェクトを消しまくる。遠藤さんは消えた。
23日 18時
ushさんが用事で離脱。
23日 19時
関数呼び出しのフックをしようと思ったのだけど、なんだかうまくいかずにタイムアップ。


しかし、リバースエンジニアリングコンテストというのはちょっと微妙な気がする。楽しめる人はすごく楽しめそうだけど、そうでない人のほうが多そうだ。sunlightを見れた160チーム中、それ以上の改善を出来たのが50チームしかないところを見ると、リバースエンジニアリングしようという考えに至らなかったチームが多いように思う。
あと、実行処理系の速度要求がきつすぎる。アーキテクチャの設計からしてprotect(0)を高速に出来ないと成り立たないのだけど、それを解決するための努力は去年のumixの高速化とはレベルが2ランクほど違う。導入部分の敷居が高いというのは、いろんな層の人が参加するICFPとしては良くないんじゃないだろうか。リバースエンジニアリングというコンセプトをとるにしても、もうちょっと処理系が簡単に書けるようにするべきだったように思う。