見出し画像

競技プログラミングは青春への扉である

「よっしゃー!解けた!」

「おいおい、全然わかんないぞ、この問題...」

日曜日の夜遅く、四捨五入したら50歳になるおじさんが、パソコンの前で一喜一憂、四苦八苦している。

パソコンを使って挑戦しているのは、競技プログラミング。プログラマー達がバーチャルに集いあい、プログラミングの腕を競い合うコンテストだ。

初めてコンテストに参加したのは3カ月前、同僚たちに触発されたのがキッカケだ。ほぼ毎週開催される初心者向けのコンテスト ABC(AtCoder Beginners Contest)に、これまで欠かさず参加している。

私の中で競技プログラミングが新しい趣味として定着しつつあるので、その理由を考えてみた。どうやら私は競技プログラミングに青春を感じているらしい。昔懐かしいあの「青春」である。分析した自分も驚いている。

私が競技プログラミングに感じている、3つの青春の要素を紹介したいと思う。

競技プログラミングとは

競技プログラミングでは、お題が与えられ、そのお題を解くプログラムを制限時間内に提出する。私が参加しているABCは制限時間100分で6つの問題に挑戦する。

出題順で問題は難しくなっていく。初心者にとっては1問目、2問目を解くのがやっとで、3問目が解けたらラッキー、4問目が解けたら天にも舞い上がる気持ちになる。5問目、6問目に至っては問題文を解読することすらままならず、神の領域としか思えない。

過去に出題された問題を紹介しよう。一番簡単なのが1問目だ。

「A x B を求めてください。1 ≦ A ≦ 100、1 ≦ B ≦ 100、入力は全て整数である。」(ABC169 A問題

例えば、5 と 9 という2つの数字が与えられたとき、5 × 9 の結果を出力してください、という問題だ。プログラミングのプの字を知っていれば解けてしまう。

2問目は、少しだけ複雑になる。

「英小文字からなる文字列 S があります。
S の長さが K 以下であれば、S をそのまま出力してください。
S の長さが K を上回っているならば、先頭 K 文字だけを切り出し、末尾に ... を付加して出力してください。」(ABC168 B問題

例えば、文字列 helloworld と、長さ 5 が与えられた時、文字列の長さは 10 で 5 を上回っている。そこで、hello… を出力することになる。「もし〇〇ならば××をする」という「条件分岐」を理解している必要がある。

青春の要素その1:ドキドキ感と安堵感

1問目、2問目の例はいかがだっただろうか?プログラミング経験者であれば「えっ!簡単すぎでは?」と感じられたかと思う。

ただ、どんなに簡単なプログラムであっても、普段やるプログラミングと、コンテストのプログラミングとで決定的に違う点がある。それはドキドキ感と安堵感だ。

普段は書いたプログラムを気軽に実行する。もし打ち間違いがあれば「エラー」になる。エラーを見て「あぁ、うっかりしてたなぁ」と言いながらちょいちょいっと直して、再び実行してエラーが無くなるのを確認する。

しかし、コンテストでのエラーはペナルティとなり、順位が下げる。そのため、書いたプログラムを気軽には提出できない。どんな簡単なプログラムでもしっかり見直し、それでも上手くいくかな?とドキドキしながら提出する。絶対に間違いはないはずなのに「正解」と表示されると「よっしゃ!」と小さくつぶやいてしまう。

競技プログラミングをはじめて、このドキドキ感と、その後の安堵感がたまらないことに気がついた。小心者だった私が毎日のように感じていた青春の大事な要素である。あらゆることに慣れてしまった今の生活の中では、味わう機会を見つけるのが難しい。

青春の要素その2:成長感

3問目以降は、問題文も難しくなり解くのがとても難しくなる。例えば ABC168のD問題(4問目)は、ロールプレイングゲームに出てくる複雑なダンジョンをくまなく探索する問題だ(興味のある方はリンク先の問題文を読んで欲しい)。

ダンジョンの全ての部屋に、入口からの最短距離を書き込んでいく。どうすれば全ての部屋を漏れなく探せるのか?入口からの最短距離はどうやって保存すればよいのか?考えなければならないことはたくさんある。初心者にはとても解ける気がしない。

しかし、競技プログラミングの問題も高校数学の試験と同様、解法のパターンが存在する。この問題なら「幅優先探索」というアルゴリズムを使うことでサッと解くことができるのだ。

数学の問題集を解きまくり「この問題にはこの公式を使えばよい」とパターンが見抜けた時、数学の成績が上がったことを思い出す。勉強すればするほど解ける問題が増えていく。やればやっただけ成長でき、それがスコアとして可視化される。社会人になると学生時代のように単純なパラメーターで評価されることはなくなってしまうので、これもなかなか味わえない青春の大事な要素である。

青春の要素その3:感想戦

コンテスト開催中に唯一禁止されていることがある。それは、問題や解法に関してSNSに投稿することである。そしてコンテストが終わった瞬間、Twitter で感想戦が始まる。学校のテストが終わった瞬間、友達同士で始まるアレだ。

特にいじわる(だと初心者が感じる)問題があると Twitter に大量の感想がつぶやかれ、トレンド入りすることがある。つい最近も ABC169 の影響で「long double」と「素因数分解」がトレンド入りした。

悔しい思いをした共通のイベントが存在し、それに不満を述べてお互いに共感するなんて、甘酸っぱい中間期末試験の頃以来の体験じゃないか。

私が競技プログラミングに感じている、青春の3つの要素について紹介させていただいた。こんなおじさんが楽しませてもらうのはちょっと申し訳ない気もするが、プログラミングは脳が健康な間はずっと続けられる大事な趣味だ。これからも楽しんでいきたい。

この記事が気に入ったらサポートをしてみませんか?