ICFPC 2014.

でした。 with @kinaba @fuqinho
完全に、年一の日記になっている。。。
まぁ、いつものごとく、自分やったことだけ。

初日

出張中のため早朝(っつーか夜明け前)開始。
すでに脳みそが死んでいる。

問題読む。ひたすら長い。
1.5h くらいは余裕でかかった。英語つらい。
まー、VM書く。振り返ると、いきなりAIから書き始めればよかったかなぁ。
VM最後まで bug ってたっぽい。細かいところの挙動が明らかにおかしい。

実装してると、明らかに spec に穴が。まぁ、例年通り。
適当に書ききって動かし始める。
Visualizer 御用達:http://en.wikipedia.org/wiki/ANSI_escape_code

並行して C++ で書いてもらってた AI を動かしてみると、それっぽい。
夕方(夜) kinaba さんが合流。
夕食食いながら、まぁ LISP ですかね、ということで、
VMLISP compiler、AI 考える、と task を割り振る。

深夜(lightning division終了前)、寝落ちしたと踏んで、AI を C++ -> GCC に hand compile/assemble。
ラベルの解決するくらいの asm は書いておくべきだった。(毎年恒例の反省)
DBUGはさめないのつらい。
結局、bug とれず。 lightning division は放棄。
就寝。

二日目

まぁ、LISP compiler できてたので、LISP で AI を書き直す。
以降、基本的に AI を C++ から LISP に書く下請けプログラマをひたすらやる。

さくっと LISP compiler 動いてすごいなぁ、さすが kinaba 先生。
ただ、括弧の数一個間違えると、一瞬でメモリを食い尽くして、virtual box を抹殺する凶器であった。
あと、変数 typo すると SEGV で死ぬので、compile 時には gdb が必須。

ゴーストさんは、お任せして、ひたすら lisp と格闘。
Mapをassoc list で実装してたけど、遅くて使い物にならない。

  • > AVLを実装。12年ぶりくらいである。一発で動く。多分ここで今回のコンテストの運をすべて使い果たした。

このころから PC が熱暴走して亡くなりまくる。
コンテスト中、別なものと闘うのも例年の恒例。。。

三日目

とりあえず、fuqinho さんが動かしてた AI を聞いて、LISP で再実装。
なんか、人手があれば C++ compiler 書けばよかったんだがなぁ、と思ったりした。
とにかく LISP つらい。

関数つくって、0 で上書きする、という謎のテクニックが作成され、ようやくグローバル変数が導入される。
あと、時刻の計算とか。
この辺から LISP compiler がいろいろ直って、普通にプログラム書けるようになる。
型チェック欲しい。

らむだまんさん食われまくるので、いろいろ細かい修正。
とりあえず、全力で逃げるのと、Power pill を追いかけにいく、フルーツ待機。
敵がよってくると、うっかりクリアしてしまうので、高得点がとれない。
配列に O(1) で触れないのが、大変ストレスフル。

あと、胃痛で死に始める。やはり出張中はだめだ。。。
巨大マップ用に枝狩りをあちこち入れる。

一応 LISP なんだけど、どう見ても手続き型にしか見えないソースを書きまくる。
関数の最後の行だけ閉じ括弧が多い謎コード。最大 18 個だった(数えた)。

胃痛がやばくて、ちょっと仮眠。仮眠すばらしい。あと、三共胃腸薬。

チーム名が決まらない。コードネームにつかったFOOを、何か意味あるものにしよう、という話に。
いくつかあげたけど、全却下された orz。
チーム名も決まって submit 。
のこり 5 分、なんか、たまに AI が死ぬケースが見つかる。
見つかるんだが、謎過ぎる。そのまま終了。

なんかできた AI

とりあえず、pill 幅優先探索。近くになかったら、適当にありそうなほうに向かう。
ゴーストよってきたら、逃げる。power pill あったらそっちに向かう。
フルーツは最優先。2個出てなかったら待つ。うっかりゴール避け。
power pillの隣でまつ。ゴーストがよってきたら食いに行く。
power pill chain つなげまくる AI とか書いてみたけど、いまいちだったので、没。

くらいかな。簡単なマップだとそこそこ動く。
けど、ゴースト次第で運ゲー
ところで、world-1って、spec 違反じゃないんかね。2x2あるし。。。

反省

腕力にたよるのは、いい加減やめてみるべき。
C++は人間がコンパイルするもんじゃないな。
LLVM BE とか覚えておけば来年は役に立つ気がする。
IFPとそろったので C をどこかから調達()できればよかったなぁ。

compiler とか asm とかがもりもり作られていくのを眺めていた。
let が導入されたときに、refactoring して書き直したんだけど、
compile 結果が同一であったので、compiler の気持ちはわかっていたらしい。

まとめ

結局、あんまりちゃんと動けてなかったなぁ、という感じ。
出張しんどい。

いつも思うんだけど、VM 書く系の部分は、なんか validator あるとうれしいよなぁ、と思う。
コレとおっておけばいいよ、的な。
どうせ、Judge も spec にミス埋め込むし。人間だもの(みつを)。

今年は、心躍る感が若干弱かったなぁ。
AI の年はだいたいそうなんだけども・・・。

さて、寝よう。