学習の栞

学びたいことと、学ぶべきことと、学べることの区別がついてない人間の進捗管理

勝負しない競技プログラミング

twitterを眺めているとこういうことを書いたほうが良いのかなと思ったので書きます。いわゆるポエムで、内容は競わない競技プログラミングの楽しみ方です。

私はkonjoというハンドルでやっている週末競技プログラマです。最近はAtCoderのレート2000-2200くらいをふらふらしています。競技歴も5年を超えて、競技歴的にもレート的にも老人とか引退とか老害とかいう立ち位置が相応しくなってきたかなという頃です。競技プログラミングを「競技」として楽しんでいる人も多いのですが、私は競技プログラミングの「競技」という側面に惹かれて続けているというわけではないので、立ち位置を書き記しておこうと思います。

私が競技プログラミングを始めた頃というのは、AtCoderが始まって間もない頃で、AGCは勿論のことABCも無く、ARCの一桁台のコンテストが開催されている頃でした。当時、日本語競技プログラミングサイトと言えば会津大学が運営する Aizu Online Judge が第一に挙がりました。私もAOJから競技プログラミングに入門することになります。Aizu Online Judge では高校生向けのPCK、JOIや大学生向けのICPC、その他模擬コンテストなどがコンテストごとに100問単位で1つのVolumeとして纏められています。つまりVolumeの順序は問題の難易度とは無関係なので正答者数の降順に解いていく人も居るのですが、私はVolume0から順に問題を解いていこうとしました。

Volume0はPCKの問題が纏められているVolumeなのですが、昔の高校生向けコンテストということで頭を捻るような問題よりも実装を問う問題が多くなっています。当時、プログラミング自体の初心者だった私にとって、これを解くことは面白く、さらに問題に正解すると問題リストの横に正答済みのチェックマークが付き、いわゆる「プチプチ」を潰していくような快感がありました。高校生向けとはいえ、時代が進みPCKの決勝の最終問題などになると論文案件と表現されるような問題も登場するほど難しくなります。さすがにそのような問題になるとノーヒントでは解けないのですが、適度に難しい程度の問題であれば数日考えこめば解法が分かったりします。私にとっては競技プログラミングの問題はパズルのようなもので、解けないからといって解法を見て解いた時点で喜びが生まれるというものでもなかったので、難しくてすぐには解けなかった問題を数週間考えこんで解いたりしていました。AOJ埋めの過程で似非クラスカル法を発明して、その後クラスカル法の存在を知った日には自分の生まれた時代を悔いたものです。問題リストにチェックマークが付いていくのを眺める楽しさに加えて、機転を利かせてプログラムの効率を改善することの面白さに気付き、競技プログラミングにのめり込んで行くことになります。

その後、TopCoderやらICPCやらに出場して、「レートは命よりも重い」という一昔前の表現に代表されるような競技としての競技プログラミングにもそれなりに順応していくことになるわけです。競技としての競技プログラミングにもそれなりの面白さはあるのですが、やはり自分としてはパズルとしての面白さや、埋めるべきチェックリストとしての面白さのほうを強く感じるようです。

とはいえ、競技プログラミングのコンテストに出る以上多少の競技とは無縁では居られません。やはり高い順位を取れば興奮しますし、低い順位を取れば落ち込みます。しかし幸いにして多くの競技性の競技プログラミングサイトにはレートというシステムがあり、最近のパフォーマンスをある程度平均化して示してくれます。いくら競技に熱心ではないとはいえ、毎週末のコンテストに出続けていれば嫌でもレートは上がるものですから、競技としての成績で落ち込んだ時は年単位でのレートの増加を見て満足するようにしています。競技プログラミングの競技性に疲れを感じ始めている方の参考となれば幸いです。