AHC001(マラソンマッチ)の参加者の使用言語の分布を調べてみた

競技プログラミングコンテストサイトである AtCoder のマラソン部門のコンテストに参加してみました: atcoder.jp 本記事では、コンテスト参加者の使用しているプログラミング言語はどういうものがあるのかを順位から調査してみました。

きっかけ

私は普段はアルゴリズムPython で挑戦することが多かったのですが、マラソンではスコアを伸ばすためには局所探索の試行回数をできるだけ多くする必要があります。

そこで、処理の高速な言語で挑戦するのがベターとなりますが、どの言語を選ぶのが良いか決め手に欠けていました。

候補として考えていたのは

といったところでした。

そこで今回は「強い人のコードを真似して強くなる」ことを念頭に置き、上位陣はどの言語を選択しているかを調査しました。

調査対象

順位表からでは使用言語がわからないため、すべての提出から、システムジャッジで  50,000,000,000 点を超えるスコアを出した解答(1,116件)を対象に集計を行いました。

そのため、システムジャッジの点数の総和がそれ以下の提出は今回の集計に含めていません。

調査1. 利用者数の多い言語は?

最も利用者が多い言語は C++ で、GCC 9.2.1 が 646人、Clang 10.0.0 が48人と、これだけで過半数を占めました。

次いで利用者が多い言語は Python で、PyPy3 (7.3.0) が129人*1Python (3.8.2) が73人でした。ここに Rustが87人、Javaが39人、C#が25人と続いていきます

C++Pythonがワンツーなのはある程度予測が付きましたが、3位のRustJavaの二倍以上多いのは意外でした。

f:id:wakabame:20210320000613p:plain f:id:wakabame:20210320002246p:plain

調査2. 上位陣に多い言語は?

スコア上位100位内にデータを絞り込みました。

こちらでは C++Rust が上位として目立つようになりました。

一方で Python は0件になり、 PyPy もかなり少なくなります。

f:id:wakabame:20210320002324p:plain

さらに上位20位以内に絞り込みましょう。

このグラフを見ると、最上位陣のほとんどが C++ を選択していることがわかります。

また、競技プログラミングでは見慣れない CrystalCommon Lisp を使って上位に食い込んでいる方がいることもわかります f:id:wakabame:20210320002625p:plain

調査3. 言語間の順位分布の比較

利用者の多い6つの言語について、箱ひげ図をプロットします。

最上位が C++ (GCC 9.2.1) でしたが、中央値では RustC++ (Clang 10.0.0) が高いようです。

「経験の長い人が敢えて C++ (Clang 10.0.0) を選んだ」・「マラソンに向けてRustを使って練習をした」ような集団がいるのかもしれません。

f:id:wakabame:20210320002949p:plain

調査4. 言語ごとの最高順位は?

参加人数が多かったPyPyですが言語ごとで見ると8番目、Pythonは15番目ということで、高得点が狙いにくい言語だったかもしれません。

一方で、Crystal, Common Lisp, Cython は人数こそ少ないですが高得点を出しています。

また、KotlinPHPでも200位周辺のスコアが出せるのが意外です。

f:id:wakabame:20210320003427p:plain

蛇足:個人的な結論

  1. C++ で取り組むのがよさそう
    • 他の言語だと、上位陣の解法を参考にする際に見れる対象が少なくなりそうでした・・・。
  2. Rust も挑戦してみたい
    • 現時点で人数もそれなりに多く、これからも増えそうです。
    • 前回の解説のサンプルコードや入力ジェネレータがRustで書かれているため、読めるようになると得かもしれません。
  3. Python の人は PyPyCython を使ってみるのを検討するといいかも?

*1:文法がほとんど似通っているため、PyPy はPythonと同枠で扱っておきます