online judge

みんながあまり言わない競プロの利点

Advent Calendar 2021 競技プログラミングを始めたばかりの人に伝えたいこと

はじめに

Advent Calendar 2021「競技プログラミングを始めたばかりの人に伝えたいこと」2日目の記事です。

投稿を決めたのは6日目ですが、空いてたので入れちゃいました。

私は社会人で、小さい娘もいるため普段はなんとか時間を見繕って競プロをやっていたりします。

競プロの年齢別人口比の正確なところは知らないのですが、学生の比率が高そうな気がするので、社会人という観点でも伝えられる面があればいいなと思っています。

アルゴリズムを学ぶことは当然すばらしい

今回のタイトルでは「みんながあまり言わない競プロの利点」なんて大きく出ましたが、競プロのよい点といえば真っ先にアルゴリズムを学ぶことの素晴らしさが挙げられるのではないでしょうか。

アルゴリズムは問題解決手順の抽象化であるがゆえに、その活用範囲はとても広いです。

私の好きな話があります。

競プロのバイブルとも言われる蟻本を書いた秋葉さんが過去の公演で語られていた「プログラムの本質」についての話です。

それまで気になっていたのは、ゲームとか作るときでも、プログラムの本質のようなものが気になると。インターフェイスがどうとか、画面を描くとか、ではなく、具体的な処理、たとえば敵をどうやって動かすであるとか、交差の判定をするであるとか、そのような部分というのがプログラムの本質のようなものではないのか。それでそのようなものは一体なんなのか、と。 そもそも若いから単語すら知らないんですよね。アルゴリズムって単語すら知らない。

これを聞いたとき、私はけっこう痺れました。「プログラムの本質」、もっといえば「知の本質」としてもよいかもしれません。 そうした本質的な何かに触れたとき、そこはかとない価値を感じる人は少なからずいるでしょう。私もそのうちの1人です。

鬼滅の刃は読んだことがありませんが、「その練り上げられた手法、至高の領域に近い」っていう感じでしょうか。

とにかく、アルゴリズムを知ることで知識欲が満たせ、さらにそれらを用いて問題が解ければ全能感すら得ることができます。

そうじゃない利点もある

難問が解ければ短時間でドーパミンぶっしゃーという感じで「百年でも二百年でも鍛錬し続けられる、強くなれる」気がする競プロですが、そうじゃない人もいるでしょう。

でも、今回はそんな「本質とか言われてもそこまでの価値を見いだせない」という人にも競プロをおすすめできる理由を並べていきます。

大きく以下の3点です。

  • 新しい言語の習得に役立つ
  • 実質コードレビュー
  • 社会人の学び直しにちょうどいい

新しい言語の習得に役立つ

まったくプログラミングをしたことのない初心者が、単に競プロのコンテストで好成績をおさめたい状況であれば、私はC++やPythonを真っ先に勧めます(使っている人が多く情報が多いため)。

が、世界最高峰の競技プログラミングサイトAtCoderでは、実に50種類以上の言語がサポートされています。

そして、初心者向けのAtCoder Begginer Contest(ABC)の序盤の問題では、高度なアルゴリズムを必要としないごくごく基本的な処理が求められます。

これが、まさに1000本ノックのような位置づけになってとても良いんですね。四則演算や配列操作、文字列処理などを通じて、新しい言語の基本的なシンタックスを速習可能です。

しかも、無料で。ちょっと試すくらいならサイト上のコードテストで動くので環境構築すら必要ありません。

普通、ハンズオン付きの演習ってなったら有料ですから、これはすごいことです。

実質コードレビュー

これまたコンテストサイトのすばらしいところなのですが、ほかの人が提出したコードが無料で見れます

つまり、自分が書いたのとまったく同じ処理を、ほかの人がどう書いたのか見ることができるんです。

業務だとコードレビューというのがありますよね。でも、かなり丁寧なコードレビューであっても自分の書いた処理をまるまま手本として併記したアドバイスをもらう機会なんて、そうないでしょう。

だって、全部書くくらいならその人が実装すれば済む話なので。

しかも、ですよ。AtCoderであれば記述量の少ない順だとか実行速度の速い順で検索することすらできます。

単一の指標のみならず、様々な観点でより優れたコードと自分のコードを比較・検討し放題です。

私はコードゴルフをするのも好きなのですが、他の人が提出したコードを読むことの学びはとても大きいです。

もちろん、GitHubを開けば優れたOSSを支えるコードを見ることもできますが、たいていそれらは巨大ですし、一朝一夕に理解することも難しく、現状の課題を把握するのに追いつくだけでも精一杯になったりします1

その点で、求められる要件が問題文として不変にあり、一定粒度で切り分けられている提出コードは、学習意欲のある初心者にとって非常に良質なコンテンツであると思います。

社会人の学び直しにちょうどいい

私は今でこそエンジニアをやっていますが、社会人になってからしばらくは製造業でゴリゴリやって(やられて?)いました。

社会人になると、(特に非エンジニアの場合などは)どちらかというと業務特有のドメイン知識の習得が多くなります。体系的な知識を座学できっちり学ぶみたいなのが、学生時代に比べるとやっぱりぐんと減ってしまう人が多いと思うんですね。

そうした中で、高校数学程度の習得が前提とされた問題群は、学生時代を彷彿とさせるコンテンツになります。

学ぶことそれ自体が知識欲や自己肯定感を高める行為なので、ぜひ生活に取り入れたくなりますよね。

前の項と少しかぶりますが、ここでのポイントは競プロでは知識のアウトプット先が1問ごとで区切りのいいコンテンツになっている点です。

小さい子供がいたりすると、なかなかまとまった時間も取りづらいですが、そうした方でも1回ごとは短時間で取り組めます。

たとえ解くのに時間がかかる難問でも、問題文さえ頭の中に入ってしまえば両手がふさがっていても考えることができます。抱っこして子供を寝かしつけるなんてときには、どうせ他になにもできやしないので、脳内で問題に取り組む絶好の機会です。

ここまで挙げた3点って、どれも結局は自分のペースで効率的に学ぶことができるということに収斂すると思っていて、まあ、ようするにそういう話です。

おわりに

最初は自動サンプルテストの方法とかをまとめようかとか思ってたんですが、そうした内容は私が書かずとも他の方がいろいろ書いてくださる予定っぽいので競プロ布教活動に勤しむ記事になりました。

とにもかくにも、競プロは楽しいです。ぜひやってみてください。そして、サンプルテストを楽にやるならOnline Judge Toolsがおすすめです。おつかれさまでした。


  1. 逆に、GitHubなどにあるOSSリポジトリを追うのが余裕だというのであれば、それだけで一生食べていけそうなので無理に競プロをやらずとも十分に豊かに生きれそうです。