ICFP Contest 2024 参加記

https://icfpcontest2024.github.io/

10年ぶり (!) にソロ参加してました。最終順位は58位でした。

順位の推移 (https://icfpcontest2024.github.io/journey.html より)

金曜日

日本時間21時に問題が公開されました。とりあえずICFP言語のパーサーとエンコーダ(文字列のみ対応)を書いて、問題を見たりコマンドを送信できるようにしました。

lambdamanとspaceshipは最初の2~3問を手で解いて、あとlanguage_testはパースした式を眺めていたら答えがわかったので送信して初日は終了。

23時頃のスコアボード(上のチャートでは期間外)。今回の最高瞬間順位

土曜日

lambdamanとspaceshipの非常に雑なソルバーを書いて、スコアはともかく解けるようにしました(雑すぎて解けない問題もあったけど…)。回答をいくつか送信していたら新しい問題「3d」が開放されました。

3dは最初の一問が解けるまでだいぶ時間がかかりました。そもそもコードの下書きをどうやって書けばいいかもよくわからず、スプレッドシートを方眼紙にして試行錯誤していました。

その後、spaceshipの下の方の問題を取得していたら[/etc/passwd]というリンク(?)が見つかり、そこから問題「efficiency」を開放できたのでサーバーのecho機能で一問解いてみました。

そうこうしていたらlightning roundが終わって、すべての問題が全員に開放されてしまいました。

日曜日

efficiencyを解くのに必要だろうと、ICFP言語のインタプリタを実装しました。遅延評価ってどう実現するんだっけとSICPを引っ張り出してきたり。(結局efficiencyではあまり使わず、むしろlambdamanに必要でした)

efficiencyはラムダ式を読んでパズルを解く趣向の問題でとても楽しかったのですが、全部解いてしまうとそれ以上はスコア向上の余地が無いのでした。

これ数独か!(アハ体験)

その後は3dに戻ってスプレッドシートをポチポチしていました。

月曜日

最終日はlambdamanの改善をしました。回答はICFP言語の式として送り、そのサイズが得点になるのでうまくゴルフすると高得点が得られます。いくつかの単純な問題については手作業で圧縮し、そのほかは回答を整数にエンコードする(4進数→94進数になるので1/3以下の長さになる)ことで縮めました。get lambdamanで見られるトップのスコア(=コードサイズ)が異様に小さいのには気づいてましたが、乱数を使うのは思いつきませんでした。

spaceshipも改善したかったんですが気力が残っていませんでした。

感想

バラエティ豊かな問題でとても楽しめました。

各所にさりげないヒントがあったりして(問題の入力がエンコードされている方法が回答を圧縮する方法のヒントになっていたり)、多くの人に楽しんでもらおうという配慮も感じられました。

ソロ参加の人は自分の好きな問題に集中することもできるので、一人で楽しむにも向いた回だったんじゃないかと思います(私の場合それがefficiencyだったのでスコアには結びつきませんでしたが…)。