2015-08-10

[]ICFP Programming Contest 2015 01:58 はてなブックマーク - ICFP Programming Contest 2015 - TopCoderの学習のお時間


例年のように会社の人と合宿して参加した。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枚もあった
  • (個人的に)食事以外ではほとんど間食せず、それなりに睡眠も取って健康的だった。コードが書けたおかげで体調良くなった

そのほか

  • 早いうちにやっておくべき事に着手するのが遅めだった
    • Power探しは公式ジャッジサーバーに提出して結果が出るまで待たないといけないのでどうしても時間がかかる。2日目の夜はまだPowerの候補を出していなくて公式ジャッジのリソースが遊んでいたのがもったいなかった
    • 順位表データはとりあえず保存しておくだけでも先にやっておきたかった。各チーム、ライトニング終了時点ではその時点でのベストスコアを出しているはずだけど、だいたいその後Power探しになって順位表がぐちゃぐちゃになるので、実際各ケースで最大どれだけのスコアが取れるのかがわかりづらくなってしまった
  • 役割分担をそこまで厳格には決めなかった
    • 本当はAI書く人は最初からずっとそれだけやるのが良いんだろうけど、まあみんなコード書きたいだろうし
    • あんまりぎちぎちにしてしまうのはコンテスト参加の楽しみという点では辛いので
  • AIのパラメタ振り
    • 盤面の特徴がさまざまなので1つのAIプログラムで対処するのが難しくて、ソルバのいくつかのバリアントで実行してベストの物を使えるように…
    • という話はしていたが結局あんまりバリアント作れなかった(実際それで良くなるのかどうかはわからない)。
  • テスタは別途作っておくべきだった
    • 手元での評価用に、正確に実行することだけを考えて作成したシミュレータを用意しておくべきだったように思う
    • サーバーに回答(またはコード)を提出して結果を得る方式だと扱いづらいので。公式がバグってることもよくあるし…
  • 開始前に「プログラムに名前をつけよう」と言っていたのを達成できなかった。特に好きなキャラクターとかないのが難しい

感想


毎回ICFPCは、いくらロジックだけ書けてもそれを人間とのインターフェース含めて有効に活用できる手段も持っていないと威力が半減するのだなあ、というのを思い知らされてたいへん学習モチベーションが上がる機会で。

そういったことを思う存分できた3日間が終わってしまったのが悲しくて、普段の中ではそこまで自由に色々できるわけではないけど、創意工夫を差し込める箇所を探して、できることを増やしていけるよう頑張ろう、