utsubo’s blog

競技プログラミングとか.

ICFPC 2020参加記

感想

初めてICFPC(https://icfpcontest2020.github.io)に参加しました。
折り紙の回とかは問題だけ見て無理だと逃げてました。

会社の(私よりレートの高い)方達と出てまして、初チーム戦*1だったので、刺激的でかなり楽しかったです。

例年は集まって参加していたらしいのですが、今年はオンラインだったので少し残念でした。

簡単に今回のコンテスト概要を説明すると、前半パートは謎解き+関数型謎言語のインタプリタ実装で、
後半パートは前半の謎が解けているほど有利なゲームAIコンテストでした。

以下、日ごとにしたこと。
記憶が曖昧なので時系列は適当です。出場した人しか意味がわからない内容になっていそうですが(過酷さ)と面白さが伝われば幸いです。

1日目

未解明の言語仕様が公開される。最初は全チームで言語仕様の解明。
SKIコンビネータとか知らなくて恥ずかしい気持ちになった(今もよくわかっておらず)。

そのうち問題が公開されて、それまでは関数型言語の勉強してほしいのかなという話をしていた。
2時頃に謎言語で書かれたプログラム(Galaxy Pad)が公開されたが、私に出来そうなことはなさそうだったので寝る。

2日目

朝起きたら、謎言語インタプリタが完成していて驚く。
このあたり何をすれば良いかよく分かっておらず置物になっていた。

Galaxy Padを使ってサーバーと通信する方法に誰かが気づく。
謎解きが進み、ついに対戦やチュートリアルが選択できるメイン画面までたどり着く。

とはいえ、まだあんまりピンと来ておらず。
結構遅くまで色々見ていたが特に成果は得られず、スタートラインが遠過ぎる…

3,4日目

ビジュアライザが完成(すごい)
ライトニングコンテスト(チュートリアルを解いた問題数で競う前半パート)の締切が終わった後だが、チュートリアルチュートリアルであることに気づく*2
私はとりあえずチュートリアルを進める。ゲーム仕様の学びがあった。

同時に対戦方法の解析も進む。

このあたりからはルールが不明確なAIコンテストみたいな感じに。

ゲームの内容は、宇宙船での1対1の対決でした。攻防に分かれ、それぞれビームやら自爆やら分裂を駆使して、攻撃側は相手を倒せば勝ち、防御側は生き残れば勝ち。

チームの方が早い段階で敵機の前の位置や速度から次の位置を推測してビームを撃つAIができていて動きが的確で凄かった。

防御側は分裂して軌道に乗せるのが強そう*3だったので、それを書いてみることに。
ギリギリ分裂して軌道に乗せるところまでなんとなく書けたが、何体かが軌道に乗せているはずなのに死んでいた...。直しきれずに終了。

他の方が分裂防御を綺麗に書けてそうだったので、そちらを位置を推測してビーム撃つAIとマージして提出。

雑記
  • Discordでコミュニケーションを取っていたが、公式の連絡も基本Discordで一貫性があり便利だった
    • 公式Discordのチャットに高速で英語で情報が流れていて追いきれなかった
  • 謎解きパートが多かったので完全に座るだけは免れて良かった
  • インフラ周りの整備の速さが凄かった
    • 負担がかなり集中してそうで申し訳なかった(手伝いたいが、手伝っても負担を増やすだけなのでごめんなさい...)
  • それぞれでチュートリアルや対戦を回して情報収集していたが、2人組みで対戦するのが序盤は効率良かったんじゃないかなぁという反省
  • 寝食のタイミングを失って消耗した(起きていてもどうしようもない時は素直に休めば良かった)
  • 小さな自動化ツールや気付きがチームの役に立って嬉しみ
    • チーム内の自動対戦環境くらいは私でも頑張れば作れそうだったのでやれば良かった
  • 色々な人の気づきで一歩ずつ前に進んでチーム感があって結構楽しかった
  • 時間が足らず消化不良感。終わってからぼろぼろ知らない要素をtwitterで見かけて悲しい
  • 運営が凄い力入ってるなぁという感じだった
    • (前後半パートのどっちかだけで良かった気はする)
  • チームの方々のお陰で楽しむことができた。ありがとうございました。

*1:ICPCやPG BATTLEを除いて。これらはなんやかんや個人の裁量が大きいので…

*2:なにを言ってるか分からないと思いますがエスパーコンテストなので...

*3:ちなみにこの分裂というコマンドは公式のドキュメントには載っておらず自分達でAPIを見つけないといけない。その他にも燃料や熱?の様な宇宙船のパラメータや重力の要素も公式情報はないが存在し、全て自分らで試して仕様を調査しないといけなかった...