私が気にする100の事象

気にしなければ始まらない。

第29回プログラミングコンテストに参加してきました

全国高等専門学校プログラミングコンテスト第29回阿南大会の課題部門に出場しました。
プロコンに行った学生たちがそれに関するブログを書いているのを見て、僕も書こうと思い立ちました。
というわけで、今回はそのことについて書いていきたいと思います。
※注意
長文です。
乱筆乱文をお許しください。
あなたが今から読む文章はあなたの将来に役立つアルゴリズムなどを記載しているわけではありません。これはあくまでプロコンに行った感想を書いただけだと思ってください。

私達がどのような過程を経てプロコンに参加したか

4月から5月にかけて

プロコン*1の競技部門の概要を見て、「スプラトゥーン*2」みたいだと思ったのは僕だけでしょうか。 いや、ただの気のせいのようです。すみません。 今年のプロコンの競技部門の内容はどんななの?って聞かれたら、一言で「陣取りゲーム」と答えることができます。 詳しいルールは、全国高等専門学校 第 29 回プログラミングコンテスト 募集概要をお読みいただければ分かります。(分かりません)*3

さて、僕たちはプロコンに参加すべく、うちのシス研*4は競技部門と課題部門に分かれて、それぞれ作業をはじめました。
それで、競技部門に加わったメンバーは、4年生2人と入って来たばかりの1年4人だけ。(後に、4年生は3人になりました。)
そう、その他の部員は、課題部門に吸い取られてしまったのです。
うちは部として課題部門に行った経験が一度もなく、今年こそはと割と力を入れていたのです。

競技部門は去年も、2年前も、鹿児島高専は参加していました。
しかし、今年の競技部門のメンバーは誰一人、プロコンへ行ったことがないのです。 1年生は入学ほやほやなので、当然プロコンへ行ったことなんてないのでしょうが、
4年生は今まで4回チャンスがあったのになぜ競技部門に参加したことがなかったのでしょうか。
実は僕たち4年生は、過去に先輩たちがプロコンをしているのに参加しようと思っていたのですが、先輩たちは先輩たちで固まっていたため、全くプロコンのメンバーに加われないまま、4年生になり、いきなりステーキならず、いきなりプロコンを強いられることになったのです。
この影響で、僕たちは後に、それ相応の苦労を味わうことになります。

ここでの反省点は、「後輩たちのために知識を残しておくこと」です。
これについては、身に沁みるほど、実感しました。
僕たちは後輩たちに何らかの成果物を残していくべきです。
幸いにも、今回は去年行った先輩に聞いたりすることができたため、そこまで困ったことは起きなかったと思います。多分。

とりあえず、競技部門は頑張るぞ!ということで、がしがし開発していました。
GitHubの記録によると4月16日21時34分から開発が始まっていたようですね。
そんなに早くやってましたっけ?

5月から7月にかけて

がしがし開発してました。
このころのGUIアプリケーションは僕が完全に作っていました。
6月14日に、Visualizer Version 1.1.0(最初のバージョン)ができました。ほとんど形だけのUIです。
7月15日には、Version 1.8.0ができました。
約300コミットくらいかけて、2.8万行くらいソースコードを書いては、2.2万行くらいソースコードを消してました。
友達は、PythonQRコード読み取るやつ作ってくれてました。

課題部門は予選落ちました。
課題部門が予選に落ちたと聞いたとき、「ああ、ダメだったか」と思いました。
落とされた理由はちゃんと聞いていませんでしたが、実際にプロコンの課題部門のブースの方へ行ってみるとなんとなく落とされた理由が分かりました。
クオリティーが段違いだったのです。

それはともかく、これで課題部門は来年まで何もすることはなくなってしまったので、僕は競技部門に加わってほしいと促しました。
課題部門に吸い取られたメンバー分を取り戻そうとしたのです。
しかし、競技部門に加わってくれるかと思いきや、「予選は落ちたけど、一応プロジェクトは完成させたいから、無理」と言われました。
意味分からなくありません?
少なくとも僕は分かりたくありません。
彼らが予選に落とされたことが悔しいのは分かります。
もし、競技部門が落とされたら、それはとても虚しい気持ちになります。
しかし、落とされたら、落とされたで、スイッチを切り替えるべきです。
目標を失ってぐだぐだやってちゃ、成果なんて上がらないです。
案の定、課題部門のレポジトリはその後、ほとんど活動していませんでした。
来年からは、予選落ちたら、こっちの手伝いをしてもらうように約束してもらおうと思います。
もちろん、競技部門の予選が通らなかったから、課題部門を手伝うし、逆なら逆です。
来年からは、そうしましょう。ほんとに。
人員が足りないのです。

8月ごろ

死にました。 夏休み入ってから、急に体調が急変して、インターンシップにも行けず、家で休養してました。 ああ、インターンシップ行きたかった……。

このころの開発は0です。 僕は7月19日を最後に、9月2日までコミットをしませんでした。 そもそも、競技部門の開発自体もストップしてました。 7月19日のコミットから9月2日のコミットまでの間にコミットされた数は6(全コミット数の約0.5%)です。 これがいわゆる「中だるみ」ってやつですね、分かります。

8月末から9月にかけて

まだ、ifelseもままならない1年生に、「列挙体」「構造体」「オブジェクト指向」などをいきなり教えるという鬼畜所業をしました。
普通なら3年ほどかけて授業で教えることをたったの3週間くらいで教えて、C#を割と強制的に教えました。
すみません。 今思うともう少し、4月ごろから教えるべきでした。
次からは善処します。

開発はぼちぼちやってました。
このころの僕は、180コミットくらいかけて7000行書いては、4500行ほど消していました。
ここらへんではみんな程よく開発していてよかった(ただし体調は除く)と思います。
Visualizerのバグも友だちと一緒に探して直してくれました。ありがとうございます。
9月最後のバージョン(9月25日)は1.21.1でした。

10月

はい、夏休み終わり。
本番に差し迫ってきました。
開発は急展開を迎えていきます。
10月9日時点で、バージョンは1.32.0となっていたのが、
10月14日で、1.54.0まで跳ね上がり、
最終的に1.101.0になりました。
バージョン上がりすぎ問題です。
10月だけで、300コミットして、3万行書き込み、6500行ほど消しました。

えっ、アルゴリズムはどうしたのかって?

アルゴリズム

とりあえずどのアルゴリズムが強いとかメンバーは誰も知らない(アルゴリズムに強い弁護士がうちの部にはいない)ので、みんないろいろなアルゴリズムを作って試せるように、Visualizerがボットを読み込める機能を装備しました。 これにより、あらゆるアルゴリズムを試すことができ、どのアルゴリズムが一番が強いかが分かります。 しかし、実際アルゴリズムを作り始めたのは10月ごろからなのです…(おい!)

結局、モンテカルロ法とかビームサーチとかをこのころの僕たちは知らなかったので、 とりあえず周囲8方向に対して、行動してみたときの敵の得点と味方の得点の差が最も大きくなる行動を見つけ出し、実行する、という単純明快なアルゴリズムが意外と最強だということになりました。(後に岐阜高専の方に「貪欲アルゴリズム」と呼ばれることになります。)

アルゴリズムについて、本番の直前にまで、どのアルゴリズムを使うか決まってなかったので、うちの高専アルゴリズムの説明はかなりぼかして書いてあります。

いざ徳島へ

徳島へ行くメンバーは学生だけだと3人になりました。
プロコン競技部門リーダーと1年生、そして僕の3人です。

プロコン前日

鹿児島から福岡へ

福岡はあいにくの雨

福岡から徳島へ

そして到着

空港からバスへ……
正直、バスがマジで辛かった。 飛行機の旅よりもバスの方がきつかった。 なんか、渋滞に巻き込まれて、1時間ほどバスに乗ってた。 プロコン本番日より疲れました。

QRコードが読めるか確認して、ソースコードを少し書き換えてすぐに寝ました。

プロコン当日

この日は鹿児島高専の文化祭です。 別の世界線では、文化祭行ってたかもしれません。

鹿児島高専プロコン高専祭部門の方が、文化祭で上映してくれました。
ありがとうございます。
予選で、UIが使いづらすぎることが発覚しました。
実際に予行練習をやっていない仇がここで露見しましたね。
小学生のころ運動会の予行練習だるいと思っていたけど、予行練習がそんなに大事だと身に沁みて実感しました。

予選の後、昼休みのうちに、すぐに修正しました。
緊張して、昼ごはんもあまり喉を通りませんでした。

本番です。
最初に富山(射水高専と対決しました。 司令は予選のときと同じくリーダーがしました。 しかし、結局途中から人力になってしまいました。つらい。
92対77で、負けてしまいました。
どうやら富山高専も2ターン目から人力だったそうですね。つらい。

リーダーが「俺もう司令やりたくない」と言ったので、 次に香港の高専と対決したときは、Visualizer開発者の僕が司令しました。
記録に残っていないので、分かりませんが、僅差で勝ちました。 ただ、国際との対戦とは勝敗には関係しないそうですね。つらい。

最後に富山高専と対戦したときは、1年生が司令をしました。
結果は58-29でボロ負けしました。

試合終了後、学生交流会に参加せずにホテルに戻りました。
そして、学生交流会が終わるころには僕たちは徳島ラーメンを食べてました。
なんか、ツイートを見る限り、学生直流会だったみたいですね。
皆様、お疲れ様です。
徳島ラーメンは美味しかったです。

ホテルに戻って、リーダーと二人で会議をしました。
1年生も呼ぼうとしたのですが、疲れて9時に寝たままでした。
鹿児島高専にお留守番しているPython完全に理解した開発者にQRコードリーダーを改良してもらいました。
それと、トランプは廃止!廃止!廃止!
あんなクソでかいカードは邪魔。
手話にしよう!
となりました。

プロコン2日目

この日は鹿児島高専の体育祭です。
なんで、プロコンと高専祭のスケジュールが丸かぶり寿司なのでしょうか。
多分優勝してたら、スケジュールずらしてもらうように、文句言えるのかもしれませんね。

最初の敗者復活戦第2試合は苫小牧高専と戦いましたが、またしても人力プロコンになり、負けました。

さて、問題の敗者復活戦第4試合。
1ターン目で、Visualizerがおかしな表示(同じマスにエージェントが2人いるという表示)をしてしまい、2ターン目から人力になってしまいました。
個人的には今までちゃんとバグなく表示できたのに、ここに来て未知のバグに遭遇したことに、かなり精神をえぐられました。
開発者だったので、もう試合中、泣きそうでした。
指示が間に合わず、実況にディスられました。
「鹿児島高専の司令が全く動いていない」
「もしかして、マウスのクリックで指示を出しているのか」
「まばたきで指示を出しているだろうか」
など。
まあ、もちろん、司令がマウスのクリックやまばたきで司令しないから、エージェントが勝手に動いてましたけど。 そして、試合終了。
負けちゃった―― 憂鬱な空気で、席に戻ってから、フィールドをよくよく見ると、ありえないことに気付きました。

これね。
もう、何も言いません。

再試合です。
今度はちゃんとVisualizerがフィールドを表示していました。
ええ、Visualizerは想定外のQRコードを読み込んだせいでバグを起こしていたのです。
製品なら想定外に対応するように作るべきですが、今回は競技用のソフトなので配られるデータはルールに則っていることを保証しているとてっきり思っていました。
そんなに世の中甘くないみたいですね。
再試合は指示も途中まではちゃんと出せました。
実況の方には、「鹿児島高専の司令はこれまた独特な合図ですね~」と言われました。
いや、手話なんですが。
結局、再戦して2回ともサレジオさんに負けました。

半年間やってきたプログラムをフルに活用できず、あっけなく負けてしまいました。

この後、負けて暇になった僕たちは、てくてく課題部門と自由部門を見て、裏プロコンをしました。
正直、裏プロコンが一番楽しかったかもです。
もっとしたかった。
スマイルホテル裏プロコンしたかった。

帰宅日

ここからプロコンとは関係ありません。
帰りは、徳島→福岡→鹿児島の予定だったのに、まさかの遅延で、徳島→東京→鹿児島へ。
やったぜ、東京行けるぜ!

そしてなんだかんだで鹿児島へ帰ってきました。

たった3日間だったのに、とても濃い経験になりました。

反省点

いろいろあるけど、やっぱり
本番の練習をしていなかった というのが一番の問題でした。
これが原因で、20秒という短い時間で敵の位置を把握できず、指示ができず…

UIかわいいね

ありがとうございます。
こんなにいいねされるとは思っていませんでした。

*1:ご存知かもしれませんが、プログラミングコンテストのことをプロコンと略します。

*2:実はスプラトゥーンやったことないんです。今回のプロコンと違って面白いのでしょうか

*3:ここの文章に書かれていることだけでは、ゲームの細かなルールが曖昧で、説明が不十分です。そこで曖昧な部分をなくすために、学生たちの質問に運営が解答したFAQを別に公開しています。しかし、このように細かいルールやルール変更を別々の文書に分けることは好ましくないと思います。最終的に決定したルールは一つの文書にまとめてほしいです。だから、僕はこの文書をお読みいただらだいたい分かるけど、まあ分からないよ、と皮肉っているのです。

*4:正式名称は「電子・情報・システム研究部」。この部活は、プログラミングを中心とした、どちらかといえばハードよりソフト中心の部活です。ちなみに、うちにはハード中心のロボコン部があります。うちの高専では、プロコンはシス研のメンバーの中から選ばれ、行くことになっています、多分。これは暗黙の了解というか、そういう文化なんです、きっと。