■ [ICFPC]ICFP Programming Contest 2015
例年のように会社の人と合宿して参加した。5人チーム。
やったこと
テトリスAIだったので、まあビームサーチかなということでまずは下に落とすだけのソルバを書いた。
2日目の午前中くらいには回転なし版がそれなりに動いて、あとはライトニングの提出に向けて回転を足して調整したり高速化したりで2日目終了。
3日目には他の人たちもソルバを拡張し始めていて、あまり他の人がコードをいじるようなつもりで書いていなかったのでアッアッ…という感じだったけど、そこで手を出してしまうと同じコードを同時に複数人で変更することになってカオスになるのでソルバの拡張は任せることにした。
公式の順位表が重くて見づらいことに嫌気がさして、ダウンロードしてきて適当にフォーマットして表示するようにした。
公式順位表のデータ部分はJavaScriptで生成されているようだったので、 Seleniumでブラウザ起動して取得→重すぎ casperjsでサイレント実行して取得→なぜかcronで実行するとうまく取れない とはまっていたけど、実は https://davar.icfpcontest.org/rankings.js をダウンロードしたら順位表データが全部入っていた…。時間をだいぶ無駄にしてしまった。
あとはビジュアライザのスクリーンショットを順位表と合わせて表示するようにした。どのような盤面はどのくらいのスコアが出ていて、ライン消すのかPowerをたくさん狙うのかどちらがよさそうかなどを判断する情報になってくれたかもしれない。
それと各チームのベスト記録を元にした潜伏なし版ランキングも作っていたので、Unagiチームの強さはだいぶ早いうちから知ることができていた。
最終日はソルバのコードもだいぶ読めない感じになってきていて、Power探しシステムが完成していたこともあり、Powerの文字列候補のネタ出しをしていた。
Wikipediaからクトゥルフ関連の単語を大量に取ってきて投げたけど、その後で 公式Twitterに「Wikipediaからコピペしてんじゃねーよ」みたいなことが書かれているのに気付いた…。
最長のPowerの長さが51文字ということで、ストーリーの文書からちょうど単語区切りが51文字になっている部分を全列挙して眺めてみて、「a new representation for ancient protection schemes (, called davar)」というとてもそれっぽい箇所があるのを発見するものの、「ep」と連なっているところが→,←の順での移動だから活用するのはほぼ無理だね、となって試さなかった(結局全然違っていた)。
時間の最後のあたりでソルバの重複盤面除去が甘いことに気付いて(自分が初期に入れたコード)直したりほかのデバッグの手伝いをしたりしていた。
例年と同じく最後はちょっと慌てたけれど提出完了。
反省
特によかったこと
- 最初に問題内容の理解を全員で合わせる機会を持った
- かなり早いうちにビジュアライザができていたので作ったコードの動きが見えてやる気が上がった
- Power探索がシステム化されて候補を探すのが効率的だった
- ホワイトボードを有効活用できた
- 合宿先に4枚もあった
- (個人的に)食事以外ではほとんど間食せず、それなりに睡眠も取って健康的だった。コードが書けたおかげで体調良くなった
そのほか
- 早いうちにやっておくべき事に着手するのが遅めだった
- 役割分担をそこまで厳格には決めなかった
- AIのパラメタ振り
- テスタは別途作っておくべきだった
- 開始前に「プログラムに名前をつけよう」と言っていたのを達成できなかった。特に好きなキャラクターとかないのが難しい
感想
毎回ICFPCは、いくらロジックだけ書けてもそれを人間とのインターフェース含めて有効に活用できる手段も持っていないと威力が半減するのだなあ、というのを思い知らされてたいへん学習モチベーションが上がる機会で。
そういったことを思う存分できた3日間が終わってしまったのが悲しくて、普段の中ではそこまで自由に色々できるわけではないけど、創意工夫を差し込める箇所を探して、できることを増やしていけるよう頑張ろう、