ICFPC2020に1人チームで参加しました。ICFPCってのは72時間ぶっ続けで行われる、チーム組んでもいい国際プログラミングコンテストです。今年はコンテストが始まってから急遽参加を決めたため、1人チームかつあまり時間をかけられませんでしたが非常に楽しかったです。 ちなみに、73位ってのは、後半ステージに参加した95チームくらいの中での73位なので、まぁ、そんなに良くはない。
概要
ICFPC、点数出たね。我らがチームdekokun(私1人)はlightning stageは1ポイントの259位、後半戦は0ポイントの73位でしたな。後半戦1ポイントも取れなかったのは残念だったけど楽しかった、来年も頑張るぞ!
— でこくん (@dekokun) July 24, 2020
今年の問題
(前半と後半の2ステージ制だったんですが前半はほとんど参加できなかったため後半のみについて書いてます)
簡単にいうと、宇宙船を宇宙語を使って操り、1対1の勝負で対戦相手の宇宙船を倒し、地球人最強を決めよう!という感じのものです。 こちらのコマンドを宇宙語に変換する/宇宙語をこちらのわかる言葉に変換する方法を学ぶところからスタートしました。
最初はひたすら何をリクエストしても宇宙人から "1101000" というレスポンスだけが返ってきて絶望しましたが、宇宙語を学ぶことで意味が分かるようになります。
1101000は (0)
にデコードされます。コンテストが進んでいくとある程度宇宙語が読める/手で書けるようになってしまい、人間ってすごいなって思いました。 (1)
は110110000100
ね。多分。
githubのprivate repo(その他privateなgit repositoryならなんでも)にdeploy keyとして運営の鍵を設定し、git pushすることでプログラムが提出できるというシステム、非常に使いやすくてよかったです。
私は宇宙語の中でも数値とpair, listのmodulate周りしか使わなかったんだけど、なんかdiscordでの他の人の話を見ていると他の演算も使ってるっぽい?まだまだ私の知らない奥深さがあるのだろうなぁ。
前半戦は関数型プログラムを自分で開発するみたいなのやってたみたいですが、前半戦が行われている頃は申し込み前、もしくは子供と2人で遊んでた頃だったので、初回submissionだけして他は何もせずに終わってしまいました、ので正直何も知らないです。
最終的な作戦ややったこと
やってることは非常にダサいのですがまぁこんな感じでやってました。力が足りずゴリ押しで異常な感じのプログラムを書いてしまった…精進したい。
プログラム: https://github.com/dekokun/icfpc-2020/tree/submission
書いてる言語はRustです。まぁ全くRustらしいコードは書けてないが…。atcoderもRustで出てるし今年のISUCONもRustで出る予定だし、もっとRustたくさん書いていきたい。
- トークンに1対1に対応するコマンドを打ち込むようなコードを書き、手でトークンを書いてsubmit
- トークンが宇宙語として正しいかどうかの確認をしていないのでdebugが異常に大変だった
- 宇宙船が真ん中に落っこちないように、velocityの方向への噴射(=velocityの逆方向への加速)をひたすら実施
- これ以外に色々試したのだがうまくいかなかった。落ちる方向の90度回転した方向に行きたかったんだけどなんかコマンド発行がうまくいかなかった。コマンドは受け付けられてるのになぜか何もしてないことになっているように見えたり、なんか全体的にルールもよくわからんみたいな感じだった
- サーバからのレスポンスを読む部分は異常なゴリ押しによって達成された
- ゴリ押ししてるコード: icfpc-2020/main.rs at submission · dekokun/icfpc-2020 · GitHub
- twitterでは"コンパイラ書いた経験が活かせそう" とかかっこいいこと言ってたけど残念ながら精進がたりなさすぎて無理だった
ちょうど私のコンパイラづくりの経験が活かせそうな局面に入ってるし頑張るぞ!!
— でこくん (@dekokun) July 20, 2020
- 弾を打つこともできなかったし敵の位置を捕捉することもできなかった。全体的に隠しパラメータの意味は何一つわからなかった。ここらへんは時間の足りなさ、一人でやることの弱点が強烈に出たなと感じた。Discordの英語でのやり取りの流れも全然追えなかった
来年に向けて
今年面白かったし来年もぜひ出たい!来年は複数人で出たいし、もっと事前に家族・仕事の予定を押さえておきたい。 1人で参加するのは相談相手もいなくて大変だし、妻が家におらず子供を見ながらプログラムを書くこともできない、また、当日になって午後休をとって会社には申し訳なかった。事前に休むことにしておけば良かった。
今年はローカルでのテスト方法を確立できなかったのは非常に開発の足を引っ張った。来年はそのあたり整備したい。
謝辞
"ようやく宇宙船の動かし方が分かった!しかしもう仕事だ…" と諦めてた月曜日、同僚から背中を押されて午後仕事を休んでICFPCに打ち込みました。感謝です。 来年は、しっかりと事前に調整して会社を休もうと思います。
ICFPC、同僚の勧めもあり、午後はまるっと仕事せずに参加することにしました。はてなという会社は良い会社です。
— でこくん (@dekokun) July 20, 2020
時系列(日記)
途中からリアルタイムで書いたら日記みたいになった。
- 2020/07/19 15:00 子供が寝た時に思い出して参加登録。すでにコンテスト開始から17時間が経過しておる。
- 妻がおらず私と子供と2人だけで過ごす日だったので全く手につかない。昼は諦める
- 2020/07/19 21:00 子供が寝たので再開。Lightning Roundがいつの間にか終わってたのに頑張ってた。APIのレスポンスの意味が何もわからん〜ってなってた。眠すぎたので寝る。
- 2020/07/20 午前 消防団の会合に参加。チェーンソーを扱う、
消防団でチェーンソーの練習してる。
— でこくん (@dekokun) July 19, 2020
- 2020/07/20 午後 眠すぎたので昼寝。子供と遊んだりしながらちょっと問題見るが意味不明すぎて困る。コマンドを送信してるはずだがサーバからは同じレスポンス(エラーなのかもわからない)が返るだけだなぁ
- 2020/07/20 21:30 子供からも解放され問題をよく読んだりDiscordでのやり取りを見てようやく意味がわかる。コマンドをmodulateしないといかんのや!しかし明日は仕事なので寝ようとする
- 2020/07/20 00:00 目が冴えすぎて寝られない。PCの前に座って再開。
- 2020/07/20 00:50 submission成功!ついにスコアボードに載る。世界で53位だ!とか言って喜ぶ。仕事がやばいので寝ることにする。
ICFPC、頑張ってたらようやくスコアボードに載った。世界で53位だ。(なお参加者数は300チームくらい、そのうちの大多数が脱落してると思われる…私も脱落しかけたがなんとかかんとか… https://t.co/rG4mb2nys6
— でこくん (@dekokun) July 19, 2020
- 2020/07/20 01:43 寝ることにするといいつつ寝られなかった。スコアは最下位付近を動いている。初期値をランダムな値にするようにしてみた。
- 2020/07/20 02:12 visualizerで見られる他の人のパラメータを真似して使ってみた。意味は全然わからない。コマンドはなぜか通らなくて困っている。
- 2020/07/20 2:20 よるおそすぎるので寝る。こんなに遅くまで起きてたの数年ぶりとかだと思う。しかしvisualizerの使い方が全くわからない。なんだこれ。初期値だけ見られる状態。
- 2020/07/20 2:33 といいつつまだ起きてる。やばすぎ。なぜかコマンド通らないのでshootにしてみる
- 2020/07/20 3:29 まだ起きてる…明日会社行けるのかな…布団で携帯でドキュメント見てたらcommandsがcommandのリストだと気づいてしまったので修正してpushした
- 2020/07/20 6:30 起きて見てみたらまだ落ちてた。辛い。コマンド変えてみた。discord見ても同じようなことやってる人いるなと観測w。ちょっとコマンドを変えて提出してみたらついにコマンドが通ってちょっと勝ち始めた。visualizerが動いてなかったのは、ただ単にコマンドが正常に発行できてなかったので1ターンも経過せずに静止画になっていたからだった…まだ初手で自爆することしかできない。自爆コマンド以外は受け付けられない。
- 2020/07/20 9:00 子供を保育園に預けた後に再開。本当はめっちゃ眠いから寝ようと思っていたんだが、面白さに勝てない。
- 2020/07/20 10:00 仕事開始直後に、Consを使ったvector指定で自爆以外のコマンド実行に成功した!最低限やりたかった第一段階クリアだ!仕事せずにやり続けたい!!!次はサーバからの返り値を解析する部分だ。しかしもう仕事で時間がない…
- 2020/07/20 14:00 同僚の勧めで午後は仕事を休んで参加している。サーバからの返り値を解析する部分だ。
- 2020/07/20 15:30 サーバからの返り値の01を解析できたと思ったが、実際に来ているのはbytes::bytes::Bytesとやらでこれを01のままStringに直す方法が分からない…厳しい。しょうがないのでformat!からdebug出力を拾ってsliceで頭の
b"
とお尻の"
をとった。ダメでしょこれw - 2020/07/20 16:00 眠すぎて30分仮眠
- 2020/07/20 16:27 起きた。サーバのレスポンスを、決め打ちで解析する作戦にしよう
- 2020/07/20 18:05 私は何をやっているんだろうと思いながらモクモクとひたすら黙々と決め打ちのデバッグ作業をしている
- 2020/07/20 18:25 ついにサーバレスポンスを利用する変更が動いた気がするのでpushして試そうとしている。しかし、結局隠しパラメータの意味がぜんぜんわからない。デプロイ時間を利用して他の人の対戦を参考にしてみよう。
- 2020/07/20 18:39 他のチーム見たら、なんかspaceshipが複数機いるんだがwwwワロタwwww私は1体しか使えないのにwwww何が起きてるのか全くわからない。。
- 2020/07/20 19:00 妻が出かけるので子供の面倒をみるために一時離脱。子供の面倒を見る間にちょこちょこはコードを触るがあまり思考できない。
- 2020/07/20 21:30 子供がめっちゃ泣いてなかなか寝なかったがようやく寝てくれた。あと30分で何をするか。
- 2020/07/20 22:00 いくつか変更を加えて自分と戦わせるが全然弱いので提出物には変更を加えずにおいておくことになった。結局何が起きてコマンドが途中から発行できなくなるのか全然把握できずに終わったな〜