ディスカバリーチャンネルコードコンテスト2024参加記

special.discoveryjapan.jp

DSICO presetns ディスカバリーチャンネルコードコンテスト。略称DDCC。

本戦に行ってきた。

3位まで賞金が貰えるところ、5位。惜しい。

DISCOとは?

Presented by DISCOだし、本戦はDISCOの本社。 このDISCOがどういう会社かというと、知らない人が大半だと思うし、私も過去のコンテストに出るまで知らなかった。

半導体を作っている会社……ではなく、半導体を作る機器を作っている会社。世界シェアで7割とか持っているらしい。このご時世、それは強い。

会社説明で「弊社は経常利益率がすごい!」と言っていて、「はー、株価はどんなもんなんだろうな」とググってみたらすごかった。

そういえば、AtCoder投資法というネタを聞いたことがある。AtCoderでコンテストを開いた会社の株を買うと儲かると。最近のDDCCはAtCoderが絡んでいないが、とはいえ、最初に参加した頃にでも株を買っておけば10倍になったんだな。さすがに怖くてもう買えない……。

ついでにIRを見てみたら、従業員平均年齢37.6歳で、平均年収が1,300万円以上だった。○○ホールディングスみたいな実質役員だけという会社でもないだろうに、この年収はヤバい。

https://www.disco.co.jp/jp/ir/library/doc/fs/fs84.pdf

あまり褒めてばかりだと回し者だと思われそうなので、気になりポイントも挙げておく。説明会でWillという社内通貨制度をアピールしている。「同僚へのありがとうの気持ちをポイントにしてちょっとしたボーナスに」なら他社でも聞いたことがあるけれど、ガチでこれで仕事を回しているっぽい。こういうの、好きな人はめっちゃ好きだろうけど、嫌いな人は嫌いそう。経営者目線とか持ちたくないから従業員をやっている人もいるだろうしな。

www.disco.co.jp

予選

今のDDCCにAtCoderは関わっていない。昔は関わっていて、決勝イベントにchokudaiさんがいたりしたけれど。AtCoderは好きだが、日本のプログラミングコンテストが全てAtCoderになるのはそれはそれで不健全だと思うので、自社でコンテストを開こうという企業にはがんばってほしい。

ということで、予選もAtCoderではない。事前に申込みが要るので注意。

問題もAtCoderとはちょっと毛色が違う。今年の問題は……無いな。たぶん、ここにそのうち公開されるはず。

www.disco.co.jp

問題の難易度はそんなに高くない。AtCoder ABCでD-Eくらいが解ける人なら全完を狙えると思う。非就活生枠の本戦進出は全完前提の解答時間争いになっているのではなかろうか。入力は全て与えられて、手元で実行する形式。しかし、Google Code Jamと違って使える言語に制限がある。微妙にパースしづらい入力形式はソースコードに埋め込むことを想定しているのだと思う。

過去に出たことがあるのにそれを忘れていて、もたもたしてしまった。他の人が本戦出場の連絡の話をしているのに遅れて連絡が来たので、繰り上がりだったのだと思う。

本戦

ツリーに感想を並べている。

実際に物を動かして競うのがDDCCの特徴。今回の問題はこれ。今回というか、ここ数年は毎年似たような物らしい。

奥の射出口からパチンコ玉が出てきて、それを穴に入れる。各穴は最大10個までしかカウントされないので、複数の穴を狙う必要がある。

射出口の向きと、台の傾きと、棒の回転が制御できる。良く見ると分かるように、たいていの穴は射出口との間に棒や他の穴があるので、上手いこと避ける必要がある。また、射出口と目標の穴を結んだ直線と棒の角度が大きかったり、台を大きく傾けていたりと、難しい状況で穴に入れると加点がある。

シミュレーション

最初の時間はシミュレーション。答えを提出すると、運営の用意したシミュレーターが動いてスコアが返ってくる。玉がどのよう動いたかなどは分からず、得られるのはあくまでスコアだけ。

これで正のスコアを取らないと、実機で動かすフェーズに進めないらしい。とはいえ、一番近いところは何もしなくても入るし、まあ適当に。朝早いから眠いし。

ということで、とりあえず射出口の向きだけ穴に向けた。ほとんどの穴は他の穴か棒に弾かれるけど、正の点数だけ取れば良いんでしょ……と思っていたけれど、ルールを良く読んだら、実機で動かすのはこのシミュレーションの得点順だった。早く実機で動かせればそれだけ直す時間が長くなるので、実は重要だった。

トライアル1回目

無事(?)正の点数は取れたので、実機用のコードを書く。

直接狙えない穴は、射出口の方向と台の傾きを良い感じにして狙う必要がある。実はそんなに難しくない。坂を転がるときの玉の回転モーメントを考慮した加速度は問題文で与えられていた。x軸方向とy軸方向に分離すると、等速直線運動なり等加速度直線運動なりになる。x軸方向とy軸方向それぞれについて目標の穴の位置に達するときの時刻を求め、その差が0になれば穴に入る。後は適当に。別にAtCoderのように10-6精度で求めなければいけないわけではないし、時間も厳しくないし、方向を1万通りくらい全探索することもできる。

実機用のコードも提出したときにシミュレーターによるスコアが返ってくる。……なんか一番近い穴以外を狙ったときは0点になるな。なんで……?

結局このバグが取れないまま実機でのトライアル。

www.youtube.com

邪魔にならない向きにしているはずの棒がめっちゃ邪魔をしていた。あらためてコードを読むと、1/1000度単位で指定しないといけない角度で、0を1個付け忘れ、1/10000度単位になっていた。これはひどい

持ち物には書かれていなかったけれど、カメラかスマホか様子を撮影できるようなものはほぼ必須。記憶だけだと直しようがない。

トライアル2回目

そのバグを直して2回目。いきなり現実の摩擦を考慮したりはできないので、「なお、摩擦や空気抵抗は考えないことにする」で素直に穴を狙っている。

www.youtube.com

まあ、こんなもんでしょ。

1個目と2個目の穴は障害物が無いので何も難しくない。3個目は、摩擦があってちょっと手前に落ちたが、棒に当たって良い感じに穴に入っている。ラッキー。4個目はさすがに手前過ぎてダメ。もうちょっと奥に行かせる必要がある。5個目はまあOK。6個目は、本当は反対側の奥の隅を狙いたいのだけど、バグって上手く動かない。

これが1回目のトライアルでできてりゃな……。1回目で誤差を修正して2回目のトライアルで確認だけするということがしたかった。

ファイナル用のコード

ということで、3個目はラッキーで入っているのでそのままで良いだろう。4個目は、適当に1.1倍くらい奥に穴があると思うことにした。6個目は、2次方程式を解くところで間違えていた。2次方程式だから解が2個あるところ、逆側だとどちらの解を使うのかが変わるのか。修正。それでも、6個目がシミュレーターだとなぜか点数が入らないんだよな。謎。きっと実機なら入るだろう(間違いは後で分かる)。あと、狙う穴を変える前の待ち時間をちょっと詰めた。

で、時間はまだ余っているがやることが無くなった。時間をもっと詰めるとか、今は完全に邪魔にならない向きにしている棒をもうちょっと傾けてスコアを稼ぐとかはあるのだけど、もう実機で確認はできないし、そこで無理すると大幅なスコアダウンになりかねない。どうせ入賞を狙える感じでもないだろうし、確実にいこう。

提出。

コードは上げておいた。

github.com

そう、実機で動かすからデバッグとかがまともにできなくて大変なのであって、コード自体は普段のAtCoderに比べればとても簡単。

会社見学

最終試技の前に社内見学。

社内にプールとかジムとかある。これは単なる福利厚生だけではなく、非常用水としても使えると。なるほど。そういや、地震で近くの学校に避難したときは、プールの水でトイレを流したりしたな。

普通は直線で切っているウェハもソフトを書き換えれば丸く切れるんだぞというデモを見た。そんなんソフトだけでどうにかなるのか。

うちの技術だとシリコンウェハを透けて見えるくらい薄く削ることもできるんだとか。シリコンは、赤色のように波長の長い光のほうが透過しやすいらしい。へー。1ミクロンくらいのペナペナになるけど、そのウェハ上に作る集積回路の配線は、そこからさらに3桁くらい細いとか。

ファイナル

皆で実機の周りに集まって最終試技。

なお、これまでのトライアルでは他の人の結果は見られない。実機が衝立で囲われて、そこに1人ずつ入って自分の出力が動く様子を見ていた。なので、他の人がトライアルでどんな動きをしていたのかは分からない。

ファイナルは2回目のトライアルのスコアの低い人から順に行うということで、ここでファイナルの順番&2回目のトライアルの結果発表。

なんか1位だった。え、マジで??? あとは、そこそこの順位で「楽しかったね」か、大失敗して悲しい気持ちで帰るかのどちらかだと思っていた。「入賞できるかも?」と期待が高まる。1位なら30万円、2位なら20万円、3位なら10万円。ちなみに賞状はシリコンウェハ製。これも欲しい。

結果。

www.youtube.com

最後~。あの方向だと手前の穴に落ちるのか。シミュレーターは正しかった……。あと、棒の向きも間違えてるな。邪魔にならないように90度回した向きにしているつもりだった。

とはいえ、5位となかなかの高順位。やっぱり実環境は難しいので、確実に動かせれば、それだけでそこそこの成績になる。

いや、でも、これは悔しい。次があったらもっと気合いを入れていこう。