競技プログラミングと言語について

更新日時:

最近同じようなことが何回も起こっていて、その度に同じことを Twitter で表明するのは時間の無駄だと思う。 Twitter で書いたことをまとめ直してここに書いておきます。

この記事を書く目的は、同じようなことがまた起こった時に時間を無駄にしないことです。競技プログラミング好きな人が同じ事項に同じ議論をして時間を無駄にしないためにあります。燃えることは望みませんが(この記事を燃やすくらいなら私に本を買ってください)、同じ議論がおきた時に(私を含めた人たちの)時間を節約する意味で書いておきます。

前提:競技プログラミングは e-sports

まず競技プログラミングはオンラインゲームである。それを遊んで競うのは e-sports である。特に AtCoder に至っては chokudai さんによると「公式見解」である。

しかも、普通の e-sports で使われるビデオゲームと同じく、相当専門性の高いゲームである。具体的にいうと、例えば以下のように表現される。

青は超優秀です。学生時代を競技プログラミングに注ぎ込んでも、ここにたどり着けない学生は大量にいます。競技プログラミング未経験者では、このレベルと競技プログラミングで戦うことは殆どの場合は無理です。8割以上のIT企業において、アルゴリズム力はカンストです。一部企業においては、少し持て余してしまうかもしれません。 ー AtCoder(競技プログラミング)の色・ランクと実力評価、問題例 chokudaiのブログ

もちろん AtCoder は未経験者でも楽しく始められるコンテンツが充実しているが、高みを目指そうと思うとどこまでも高みがある。部外者がちょっとやそっとでわかるような代物ではないことは Rate 0-2800 のコンテストや All の問題を解こうとすれば嫌でもわかるだろう。現在我々が紡いできた汎人類史上一番難しいプログラミングコンテストが AtCoder にある。

言語はコントローラー

競技プログラミングは問題の解決能力、アルゴリズムの構築能力、実装能力などが問われる競技である。具体的にいうと問題に対して全てのテストケースに AC するプログラムをどれだけ早く正確に解けたかで点数をつける。

先ほど競技プログラミングはゲームだと書いたが、オンラインゲームである競技プログラミングに、様々なルールがかかるのはむしろ当然であろう。その意味において、言語はコントローラーである。

実際 IOI や ICPC は AtCoder よりも制限がかかっている。例えば IOI は以下の通りである。

Each submitted source program must be written in C++, Pascal or Java, it must be smaller than 256 KB, the evaluation server must be able to compile it in less than 10 seconds and at most 512 MiB of memory. ー IOI 2018 Competition Rules

ICPC は以下の通りである。

The World Finals programming language tools include Java, C, C++, Kotlin and Python. See the Programming Environment Web Site for detailed configuration information. Before the World Finals, the judges will have solved all problems in Java and C++. ー World Finals Rules for 2019 - Updated 4 Oct. 2018

自分の好きな言語への対応が適切ではない、もっと配慮しろというのは、わかりやすく言えば 「スプラトゥーン 2 をやるのに XBOX ONE のコントローラーをどうして使えないの?」 と言っているようなものだろう。「そんなの知るか、素直に Joy-Con 使うかプロコン使え」と普通の人は返すと思う。これは AtCoder だけの問題ではない、競技プログラミングというゲームは、そういうものである。

これは余談だが:今までの人生で私が一番気に入っているコントローラーは XBOX ONE のコントローラーである。だけどそれでスプラトゥーン 2 をやらせろとは絶対言わない、考えたことすらない。普通にプロコンでやっているし快適である。

最近何がおきているか

しかし AtCoder は 親切にもいろいろな言語で提出できるようにしてくださっている 。ごく最近では「自分の好きな言語で参戦したい」という層を受け入れることに成功していて、顕在化している。具体的には Python 使いたいとか Haskell 使いたいという層を観測している。

それは AtCoder の参加者が急速に増えていることにつながっているのではと思っている。その意味では良いことだと思う。

しかし、それがゆえに、ごく最近では、提出可能な言語に一定の配慮を求める動きが時折発生している。中の人も時々対応なさっているようだ。さっき書いた通りこれは「スプラトゥーン 2 をやるのに XBOX ONE のコントローラーをどうして使えないの?」と同じレベルの言葉である。

これに対してどう思っているか述べる前に、私の経験を述べたいと思う。

私と C++ の関係

要約すると、 私は競技プログラミングのために C++11 を学んだ。

私がこの世界に入ったのは、トーダイ最期の思い出(?)に、難しい実習とされていた「実践的プログラミング」を受けてみようと思ったからである。

修士課程 2 年のときである。当時はある会社から内定も出ていた。もう本当に今年で最後なんだな、ならツワモノ揃いで有名な「実践的プログラミング」やってみようと思って行ってみた。とにかく行ってみて、どんなものか体験してみようと思った。

するとこの年は、金子先生は毎週 PDF ファイルを作ってくださっていて、 C++11 で 1 行も書いたことのない初心者でも学べるようになっていた。この実習は要するに AOJ を使って ICPC 対策する実習である。そこで私は、初めて C++ を勉強することになった。実はこれが私の人生の大きなポイントになっている。詳細は別の機会に譲るが、競技プログラミングの出会いが決め手になり、内定を辞退し、博士課程に行くことを決心した。

これは 5 年以上前のことである。その上で、今起きている事象を考えてみると、 当時の自分はなんて謙虚だったんだろうと思う。金子先生が指導してくださったとはいえ、何の疑問も持たずに C++11 を学び AOJ や AtCoder をやっていたのだから。そこに疑問を感じなかった。 実プロは ICPC 対策の実習で、そのため C++11 をまず学ぶのが(誤解を恐れずに言い切れば)当たり前であった。

標語的に言えば、 当時の私は「コントローラーに触れたこともなく、チュートリアルに 1 学期もかかるゲーム」をわざわざやっていた のである。

それを美談にするつもりは全くない。色々な、緩やかな道はあっていいと思う。ただ別に私自身は、競技プログラミングをやるために C++11 を学んだという経緯があり、それは別になんら苦痛でなかった。金子先生は非常に丁寧に指導なさる先生だったからというのももちろん大きい。しかし、決して苦痛でも苦行でもなかった。それが普通だった。

私にはどう見えているか

その上でいうと、先ほど述べたような「事象」は、「俺の好きなコントローラーに合理的配慮をしないゲームに悪印象を持つ」とか「チュートリアルが面倒だから飛ばしてしまおう -> 全くできない」とか言っているようなものだな、というのが、私の理解というか、印象に近い。

私は普通のビデオゲーム愛好者だからこれだけは言っておきたいのだが、 ビデオゲームは、やりたくない人にお願いしてやってもらうものではない。好きだから、やるものである。 大学の必修科目のように、卒業するために必須のものという訳でもない。そもそも競技プログラミングで使うプログラミング能力自体、プログラミングの一部分であり、相当偏ったものである。コンピュータサイエンスの原始的で重要な能力を測っているとは思うけれども、決して全部ではない。会社によってはビジネスにも直結しないだろう。それがたまたま自分の好きなゲームではないというだけで、何が悪いのだ。嫌ならやらなければいいだけの話だろう。 Nintendo Switch や iPad にはいっぱい楽しいゲームがあるし、体を動かすのが好きなら普通のスポーツをやればいい、それも、好きなゲームだけをやればいい。私はそう思う。

しかしこういう「自分の好きな言語に配慮をしない AtCoder に悪印象」という意見が出てくるということは、それだけ競技プログラミングが人口に膾炙しつつあるということでもあろう。今までビデオゲームやったことのなかった人がスマホゲーに興味を示しているようなもので、過去ゲーム業界が何度も通ってきた道でもある。こういうことが起こるたびに AtCoder の中の方が泥を被るのは大変だろうけども、業界が大きくなると副産物で出てくるものかもしれない。