ICPCの予選に出た

 ICPCの予選に参加しました。人々が参戦記っぽいのを書いているので、僕もなんか書き残しておこうと思います。とはいえ、問題に関しては語れるほど実力も記憶も無いので、なんかその前後の、パーソナルでおよそ競プロの役には立たないであろうことを書きます。

 

 僕の住んでいる場所の北のほうに、一乗寺というラーメンの激戦区があって、初めて行った人はドン引きしたくらいのラーメンの過剰供給が行われています。で、その軒々の中にいわゆる二郎系と呼ばれるジャンルの店があって、僕はある日サークルの悪い先輩と一緒にその店の一つに行きました。

 血のように赤い机に乗せられた、見るからに身体に悪そうなラーメンを食べ終わると、あらゆる消化器が異常を訴えてきて、まるで墜落寸前のコックピットのような状態の帰り道、その悪い先輩が僕に声をかけてきました。

ICPC、出てみない?」

 詳しく話を聞いたところ、ICPCとは3人1組で戦う競技プログラミングの大会らしく、今から思うと非常に唐突な話だとは思ったんですが *1、話をしている先輩はとても楽しそうに見えました。で、僕は前述の理由で思考が停止していたので、なんか楽しそうだなーという感じに思って、まあ出てみよっかなーという気持ちを持って、気付いたら参戦表明していました。

 時間が経つにつれて徐々に思考が正常化してきて、まあ競プロ未経験の人となら(自分が何かしでかしても笑って見逃してくれそうだし)組んで出てみてもいいか、という気持ちになって、そしたらその日のうちにメンバーが集まってしまったので、そのままチームを組んでエントリーする感じになりました。情報学関係の所属が一人もいないというフル外様チームなので、チーム名は「Guest」に決まりました。とても良い名前だと思いました(自画自賛です)。

 その後、三人で一所に集まって、過去問サイトにあった一問を解いてみることにしました。ご飯を食べながら「これどう解くんだろうねー」って話をして、ちょっと紙に書いて考えを整理したりして、部室に戻って実際コードを書いたりしてみました。……1~2時間かけても全然書けなくて、というか解き方すらおそらく分かっていなくて、非常につらい気持ちになりました。

 しかもこれ、8問あるうちの1問目として出題されたそうで、難易度表でも最易ランクに分類されてる問題でした。で、部室にいた競プロが得意な人が僕達の苦悩を耳に入れて、今解いてる問題を教えたところ、数分後には予想していたより遥かにシンプルで明快な解答のコードがホワイトボードに残されていました。

 

 その後しばらく月日が経って、その間に勉強してれば良かったんですけれど、少なくとも僕は完全に放置してSteamとかを起動しまくっていて、そのままリハーサルの日になりました。リハーサルも予選も情報学関係の校舎で行われたのですが、僕はそもそも理系の校舎に足を踏み入れることすら初めてだったので非常に緊張していたため、「学生実験室」なる場所に白衣なしで入って大丈夫なのか、メガネは念のため保護ガラスのやつを使ったほうがいいのかとか色々考えてたんですが、入ってみたら良い椅子と見た目のイケてるパソコンが並んでいるだけの部屋でした。

 リハーサルの前にちょっと環境をいじれる時間を与えてもらっていたので、その間に先輩がVSCodeとかデバッガとかの設定をやってくれました。で、準備は万端、あとは問題を読んで寝るだけと思って待っていたのですが、なんか色々なトラブルでリハーサルの始まる時間自体が遅れてしまいました。余った時間でアルゴリズムの勉強でもしていたら、と今でも思うのですが、我々は有り余った時間をVSCodeのおもしろ拡張機能を検索することに費やしてしまって、結果エディタの右下に魔理沙ちゃんが表示される機能が追加されました。この機能は優れもので、複数タブを開くとキャラは霊夢、フラン……という風に変わっていきます。

 面白かったのでゲラゲラ笑って、無言で機能をオフにしました。魔理沙ちゃんは消えませんでした。アンインストールしたり設定ファイルをいじったりしても消えなくて、そうこうしてる間にいよいよ始まりそうな雰囲気になってしまって、結局予選本番まで魔理沙ちゃんが表示されたエディタでコードを書きました。とても癒やされたし、まあ結果オーライなので良かったと思います。リハーサルは2完でした。……敗因はだいたい最後に書きました。

 予選当日、僕は出ようと思っていた必修授業が終わると同時に下宿のベッドで目を覚まして、結局4限だけ出てから行くことにしました。で、4限の授業を聞き流していたのですが、ふとtwitterを眺めていたら僕のアカウントが大量の強い発言を垂れ流していました。

 

ICPC当日の私のツイートをご覧いただいた全ての皆様へ

 ICPC当日に私のツイッターアカウント(@_kypu)から為されたツイートは、そのほとんどが私自身によって投稿されたものではありません。その詳細については、過去のブログ記事をご覧ください。

kyp.hatenadiary.com

 今回の事態を重く受け止め、当該記事中に紹介されたbotは現在全てその活動を停止しております。また、当該botによる発言はすべてクライアント名が「やさしい空間」となっておりますので、クライアントミュート等が可能な環境への移行を強くお勧め致します。

 

 学生実験室に着いたところ、隣の場所にいたKMC部員(dragon)に「全完するんだって?」と煽られました。不適切な発言でした。大変申し訳ありませんでした。

 

 なんか文字数が予想以上に膨らみ始めて、ついでに眠くなってきたので、手短に結果だけを言うと3完でした。解くのにかかった時間の関係で、全出場チームの中でも平均以上の順位につけることができました。僕はA問題とC問題を実装したのですが、書いている最中にチームメイトがどんどん誤りを指摘してくれて非常に助かりました。

 C問題まで解けた時点で時間が半分近く残っていて、調子に乗った僕は「このペースで行けば全部で6問解けるじゃん!」とか叫んでいたんですが、D問題の時点で解法が全然浮かばなくてダメでした。残りの時間は紙に向かって謎の概念図を書き続ける人となっていたんですが、そんなことより問題文を注意深く読んで条件を考えたり、少しでも実装を進めてみるべきだったなあと思います。

 最後になんかいい話っぽく纏めたいので、非競プロ勢がいきなりICPCに参加するにあたって(主にリハーサルと予選の時間中に)学んだことを短く書いておきます。

1. 1文字変数はなるべく使わない

 確かに競プロのコードはバンバン1文字変数が出てくる印象がありますが、あれはそれなりの訓練を積んだ人だから書いたり読んだりできるんだと思います。何の訓練も積んでいなかった僕が一文字変数を取り入れまくったところ、リハーサルで変数を取り違えまくって、意味不明なカウンタや参照を生み出しまくりました。少なくとも3完程度で時間が勝敗を分けることは無いので、少し遠回りでも分かりやすいコードを書いて着実に正解すべきだと思いました。

2.みんなで実装してる人を見る

 上にもちらっと書きましたが、僕は実装中に周りの人々にコードを見てもらえたおかげでだいぶミスを省けました。特に本番は慣れない環境だし、あまりコード自体書いた経験が少ないと、思ってもないミスを連発しがちです。リハーサルでは一人ごとに担当の問題を決めて完全分担で行ってましたが、自分の考え方やコードの誤り、あるいは問題の読み違えに苦戦しまくりました。なので、ディスプレイを後ろから生暖かい目で見る人の存在は確かに必要だと思いました。

3.緊張しない

 教室の構造的に仕方ないのですが、周りで解いてる人々の声が沢山聞こえてきます。で、やっぱり周りとはレベルの差が歴然としているので、僕がBとか実装してる間にDの考察してる声とか、あるいは純粋に問題が通って歓喜してる声とかが聞こえてきました。なんかそういうのを聞きながらキーボードを打つと、自然とタイプが早くなって、ところでタイプミスして、めっちゃ焦りながらバックスペースを連打したりする羽目になります。やっぱり緊張しないことが大切だと思いました。……どうすればいいかは謎ですが。ちゃんと準備して行くべきでしたね。

 

 短く書くつもりが長くなってしまいました。あと、もう一つだけ感想を言うと、情報学科は椅子もトイレも文学部の100倍くらい綺麗でビックリしました。実際の性能はさておいて、パソコンも見た目かっこいいし。予算を分けてくれ!という気持ちになりながら、柔らかくて回る椅子でぐるぐるしてました。楽しかったです。

*1:とはいえ何らかの文脈があった気がする