競技プログラミングコンテストサイトである AtCoder のマラソン部門のコンテストに参加してみました: atcoder.jp 本記事では、コンテスト参加者の使用しているプログラミング言語はどういうものがあるのかを順位から調査してみました。
きっかけ
私は普段はアルゴリズムに Python で挑戦することが多かったのですが、マラソンではスコアを伸ばすためには局所探索の試行回数をできるだけ多くする必要があります。
そこで、処理の高速な言語で挑戦するのがベターとなりますが、どの言語を選ぶのが良いか決め手に欠けていました。
候補として考えていたのは
- C++
- 多くの人が使っている印象がある
- 焼きなまし法のコツ Ver. 1.3 - じじいのプログラミング のように、解説記事も豊富な印象がある
- Rust
- 勉強になりそう
- AtCoder Editorial - Introduction to Heuristics Contest でも解説中のサンプルコードが Rust で書かれている
- C#
- Chokudai さんが使っているらしい
- Java
- tsukamoさんによる 競プロ解法紹介~レベル別マラソンの戦い方~ - Qiita のようにわかりやすい解説がある
- これまでに少しだけ書いたことがある
- PyPy
といったところでした。
そこで今回は「強い人のコードを真似して強くなる」ことを念頭に置き、上位陣はどの言語を選択しているかを調査しました。
調査対象
順位表からでは使用言語がわからないため、すべての提出から、システムジャッジで 点を超えるスコアを出した解答(1,116件
)を対象に集計を行いました。
そのため、システムジャッジの点数の総和がそれ以下の提出は今回の集計に含めていません。
調査1. 利用者数の多い言語は?
最も利用者が多い言語は C++
で、GCC 9.2.1
が 646人、Clang 10.0.0
が48人と、これだけで過半数を占めました。
次いで利用者が多い言語は Python
で、PyPy3 (7.3.0)
が129人*1、Python (3.8.2)
が73人でした。ここに Rust
が87人、Java
が39人、C#
が25人と続いていきます
C++
とPython
がワンツーなのはある程度予測が付きましたが、3位のRust
がJava
の二倍以上多いのは意外でした。
調査2. 上位陣に多い言語は?
スコア上位100位内にデータを絞り込みました。
こちらでは C++
と Rust
が上位として目立つようになりました。
一方で Python
は0件になり、 PyPy
もかなり少なくなります。
さらに上位20位以内に絞り込みましょう。
このグラフを見ると、最上位陣のほとんどが C++
を選択していることがわかります。
また、競技プログラミングでは見慣れない Crystal
や Common Lisp
を使って上位に食い込んでいる方がいることもわかります
調査3. 言語間の順位分布の比較
利用者の多い6つの言語について、箱ひげ図をプロットします。
最上位が C++ (GCC 9.2.1)
でしたが、中央値では Rust
や C++ (Clang 10.0.0)
が高いようです。
「経験の長い人が敢えて C++ (Clang 10.0.0)
を選んだ」・「マラソンに向けてRust
を使って練習をした」ような集団がいるのかもしれません。
調査4. 言語ごとの最高順位は?
参加人数が多かったPyPy
ですが言語ごとで見ると8番目、Python
は15番目ということで、高得点が狙いにくい言語だったかもしれません。
一方で、Crystal
, Common Lisp
, Cython
は人数こそ少ないですが高得点を出しています。
また、Kotlin
やPHP
でも200位周辺のスコアが出せるのが意外です。
蛇足:個人的な結論
C++
で取り組むのがよさそう- 他の言語だと、上位陣の解法を参考にする際に見れる対象が少なくなりそうでした・・・。
Rust
も挑戦してみたい- 現時点で人数もそれなりに多く、これからも増えそうです。
- 前回の解説のサンプルコードや入力ジェネレータが
Rust
で書かれているため、読めるようになると得かもしれません。
Python
の人はPyPy
やCython
を使ってみるのを検討するといいかも?Cython
への書き換えは 深入りしないCython入門 - Qiita をひとまず参考にするとよいかもしれません。