key"はわかったものの、それを出力する回路をどう構成すればいいか全くわからない。入力したい段数分遅延させたらいいんじゃないかなあというぼんやりしたイメージは浮かんだものの、具体的な構成方法が全くわからないので、その発想はすぐ消えてしまうのであった。した目標がさっぱり立たないので、まず「入力にかかわらずに決まった値を出力する1入力1出力の回路」を考えはじめる。いえばgraphvizでの回路の図示も実装してみたが、左右の出力がちゃんと左右に配置されなくてあんまりわかりやすいものにはならなかった。0:00〜ノートに回路を殴り書きしながらうーんうーんと頭をしぼって、ようやく「任意の入力を受けとって0を出力する」回路の構造の概要を思いつく。作ると10ゲートを越える回路になりそうで、かつ似た構造を2つ重ねたものだったので、まず手書きする気は起こらない。いうのは自動生成だろうと思って、ちょっとだけ書くのが楽な、回路を生成するためのDSLもどきをrubyで実装しはじめる。2:00〜このへんで簡単に回路を合成できるような機能までを含めて回路自動生成コードができてた。その上で「0を出力する回路」ができたので、それを元に1を出力するもの、2を出力するものを作ってライブラリ化。むきー!」という気分になっていたのだが、実はこの蓄積が最後の最後にちょっとだけ役立った。あと本大会の目的が勝ち負け関係なしの「なんとか得点を得ること」というものに下方修正されたのもこのあたり。それ以降どうしてたかちょっと覚えていない。「マルドゥックスクランブル」を読みかえして勇気をふるいたたせつつ、回路の内容がさっぱりわからないのでヒントを求めて問題に書いてある回路を解析しはじめてすぐに絶望的な気分になったりする。7:00〜問題に書いてあるサンプル回路の解析、などという無茶なことをはじめたせいで、回路の左出力は引き算であること、回路自体は遅延する線の数だけ変数を持つ漸化式で表現できること、などなどには気がつくがそれ以上のことはわからず、何もすすまない。回路の夢を見た気がする。15:00〜こんどは夕方には起きたが全く進展なし。相方とも時間があわず1人絶望をかかえて愚痴をtwitterに吐き散らしたりする。「全然やった気がしない!」とか叫んだ。月曜日は仕事を休めなかったので実質日曜の深夜までがタイムリミット。21:00〜相方M君と話して「やっぱり入力関係なく数値を出力する回路を作るしかない」という方針を再確認。再確認したところで、希望の入力を出力するためには、多段に遅延する回路を作るしかないよなあ、というところに戻って、今度はイメージが消えないうちに真面目に考えはじめる。最初は、任意の数値が出せるような構造が思いつかなかったのでadhocに1番目に1を出す回路、それに加えて2番目に1を出す回路、、というふうにインクリメンタルに手で回路を考えはじめる。回路生成プログラム上でコーディングしながら回路シミュレータで結果を確認して試行錯誤。入力がなんであれ先頭から「11」を出力する回路はできたが、3番目でややこしくなりすぎて途方にくれる。23:30〜一段ずつ手で回路の構造を考えるのは複雑になりすぎたので、一定の形式で任意の数列が出力できるような構造に思いをめぐらせる。ここでようやく思いつく。入力によらず0,1,2を出力し続ける"定数回路"は既に手にはいっているので、左に入力された値に対して、右入力に繋げる"定数回路"を適切に選んでやれば、左出力の出力の値は完全にコントロールできる。いうゲートを逆向きにN段繋ぐと、入力によらずN個の数字を出力する回路ができあがる。出力したい値を各定数回路にエンコードした回路を構成できる。20nくらいの大きなものになる。いえ、この時点では回路のサイズなんて知ったこっちゃないので、そのまま急いで「指定した出力を行う回路生成プログラム」をコーディング。定数回路のライブラリが既にあったのでほぼそれを繋ぎあわせるだけで実装完了。30分かからなかった。key"を出力する回路(確か260ゲートくらい)を生成して、どきどきしながらsubmit。prefix.とおった!長かったー!本当はここからが本番のはずなのだが、もうタイムリミットと言える時間だったし、任意の数列を吐ける回路生成ツールができたのである程度満足してしまう。Mくんにツール群を託して風呂へ。1:30〜風呂からあがったらスコアボード上で得点が増えていた。key"に"1111"をくっつけただけのやつでも最初のほうのかなりの数のCarにパスすることを発見していた。最後に訪れたsubmit祭り。いえ僕はもう得点にあんまり興味がなくなっていたのとサーバが無茶苦茶重くなっていたので、CarとFuelのエンコーディングのところの問題を読みなおしたりしながらじっとsubmit祭りをみまもる感じに。難しそうなCarにsubmitしてもらってそのエラーメッセージを見たりしていたが実質的にはもう何もせず。3:00〜結局25台のCarにsubmitを通したところで疲れたり満足したりタイムリミットだったりして終了。自動生成して都合のよい回路を探索するようコードは一行も書かなかった。いうか回路を育てていくアルゴリズムがぱっと思いつかなかったので、思いっきりスルーしてた。そっち方面の勘を養っとくべきかもなあ。今回は「回路の構成のしかたがわからん」ということにつきる。最後にぎりぎり「Carに合うFuelを生成したり、Fuelが生成しにくいCarを作る」という今回のお題の入口には立てたものの、「他のプレイヤーとのコミュニケーション」はさっぱりできませんでした。エンコーディングの推測は楽しそうだったので、まだ余裕があるうちにそれが役立つ局面までは辿りつきたかった。三日目だけ行ってきました。土曜日行けなかった上に今日もかなり寝過したのでセッションはほとんど見れなかったけど、ふつうのコンパイラを先行販売で手にいれたのと、某動画配信者の方と会えたのでよし。Kaigiのテンションはすごかったのでそれもよし。