AtCoderの暖色コーダ(黄・橙・赤)はどれだけの速度でコードを書く? ユーザの解答時間を色別で集計してみた

[Supership](https://supership.jp/)でVPoEをしている名畑です。2023年冬アニメの[テクノロイド オーバーマインド](https://techno-roid.com/anime)を見ていて、その内容から[うたプリ](https://www.utapri.com/)を思い出していたら、[上松範康](https://twitter.com/agematsu)さんの作品だと後から知りました。ストーリー展開が予想外で面白いです。

:::note info
AtCoderについて調べてみたシリーズの過去記事
- [そもそもAtCoderとはどんなものか](https://qiita.com/nabata/items/44fa3995e476b12b9860)
- [誕生年毎のアクティブユーザ数](https://qiita.com/nabata/items/75407e48c7ca8de8a4a4)
- [アクティブユーザの世代別国と地域](https://qiita.com/nabata/items/28b5572978ee4abb0126)
- [プログラミング言語シェア](https://qiita.com/nabata/items/1f9c0543fad5c6106d19)
:::

## はじめに

競技プログラミングのサイトである[AtCoder](https://atcoder.jp/)には下記3種類の代表的なコンテストがあります(Heuristic Contestというものもありますが今回の記事では対象外とします)。

- **AtCoder Beginner Contest**(通称**ABC**)
- **AtCoder Regular Contest**(通称**ARC**)
- **AtCoder Grand Contest**(通称**AGC**)

ABC、ARC、AGCの順番に対象ユーザのレベルが上がり、問題の難易度も上がります。

また、AtCoderではコンテストの順位が大きくは下記の3つで決まります。

- **どれだけの問題を解いたか**（正答数で得点が決まる。問題毎に得点は異なる）
- **どれだけの速さで解いたか**（同一得点のときは解いた時間で決まる）
- **どれだけミスをせずに解いたか**（ミス数に応じて時間が加算される）

（絶対ではないですが）同一コンテストではA問題、B問題、C問題……と段階的に難易度が上がっていきます。つまり、A問題が最も簡単です。

たとえば初心者向けであろう**ABCのA問題**は、大体の場合、プログラミングの基本的な文法知識（ifなど）があれば手こずらない難易度です。
**ARCのA問題**や**AGCのA問題**になると、競技プログラミングの経験がまったくないと厳しいでしょう。

こういった各コンテストの**A問題**をユーザは**どれぐらいの時間で解くのか**、そして**レーティング（色）によって速度にどれだけ違いがあるのか**、今回は集計してみました。

AtCoderをやっていると**自分より上の色のユーザは手の届かない化け物**に見えるものですが、実際にどれだけ遠い存在なのか、あるいは近い存在なのかの可視化を試みての一環です。色と実力の関連の数値化とも言えますね。

結論としては「**暖色ユーザってやっぱりえげつないし、寒色ユーザもえげつない**」と思いました。

## 前提

前提がそれなりに長いです。
[いきなり結果を見たい方はこちらをクリックしてください](#結果)。

### 問題を解く流れ

AtCoderをやったことがない人のために、問題を解く流れを簡単に記載しておきます。

1. 問題を開く
1. 問題を読む
1. コードを書く
1. 入力例を試す
1. コードを提出する

提出したコードが正しければいいので、入力例を試さない人はいるのかもしれません。

### 色について

AtCoderの色はそのユーザが上位何%にいるかを示します。

| 色 | レーティング|
| :--- | :--- |
| 赤 | 上位0.3% |
| 橙 | 上位1% |
| 黄 | 上位3% |
| 青 | 上位7% |
| 水 | 上位15% |
| 緑 | 上位30% |
| 茶 | 上位50% |
| 灰 | 1回でも参加 |

**赤〜黄**を**暖色コーダ**と呼ぶらしいです。**青と水**は**寒色コーダ**ですかね？

[AtCoderの社長である高橋様のブログ記事](https://chokudai.hatenablog.com/entry/2019/02/11/155904)を読むと色毎の実力がより把握できると思います。「**赤はもうなんか世界大会とかに招待されたりする**」だそうです。

### 調査対象の問題

- ABC 285(2023/1/15開催)
- ABC 284(2023/1/7開催)
- ARC 153(2023/1/14開催)
- ARC 152(2022/11/20開催)
- AGC 060(2022/12/25開催)
- AGC 059(2022/12/4開催)

上記6コンテストそれぞれのA問題を対象とします。
A問題だけに絞った主な理由は集計のしやすさです。

### 調査対象ユーザ

各コンテストにおける**レーティング変更対象のユーザ**のみを対象としています。つまりは評価を懸けて挑んでいる人たちということです。

- **ABC**の場合は**青**まで
-  **ARC**の場合は**橙**まで
-  **AGC**の場合は**水**以上
-  その上でコンテストにおいて**Rated**にしている

※AtCoderではUnrated(レート反映対象外)にして参加することもできます。

### 解答時間(解答速度)の定義

まず、解答時間を求める上での**対象となる提出**を下記とします。

- 対象ユーザのコンテスト時間内でのA問題でのACであること
- 対象ユーザのコンテスト時間内での最初のACであること
- 対象ユーザのコンテスト時間内での最初の提出がA問題であること

つまり「**最初の提出がA問題でWA**」「**2度目の提出もA問題でAC**」であれば「**2度目の提出が対象**」となります。
「**最初の提出がB問題でWA**」「**2度目の提出がA問題でAC**」の場合は対象にはしていません。

**対象となる提出**を求めた上で**提出時間とコンテスト開始時間の差**を**解答時間**としています。

「**最初に全問題を読んだ上でA問題から解き始める**」という人もいるかもしれませんが、その場合は「**全問題を読んだ時間も解答時間に含まれる**」となります。

※ **AC**は**正答**のこと、**WA**は**誤答**のこと

### 算出した値

**平均値**と**中央値**と**最上位色倍率**を**コンテストと色別**に算出しました。

**最上位色倍率**は**そのコンテストにおける最上位色(ABCなら青、ARCなら橙、AGCなら赤)と比較して中央値が何倍か**です。

値がばらつく上に最大値がほぼコンテスト時間一杯(ABCなら6,000秒、ARCなら7,200秒、AGCなら10,800秒)となりうるため、平均値より中央値の方が比較には適していそうです。1人でもコンテスト時間をA問題ですべて使った人がいたなら、平均をかなり押し上げてしまうため。

## 結果

ここから先が結果となります。
コンテスト毎にまとめています。

## ABC 285 A問題 Edge Checker 2

- コンテスト名：[AtCoder Beginner Contest 285](https://atcoder.jp/contests/abc285)
- コンテスト時間：2023-01-15(日) 21:00 ~ 2023-01-15(日) 22:40 (100分)
- A問題：[Edge Checker 2](https://atcoder.jp/contests/abc285/tasks/abc285_a)

木を知ってさえいれば非常にシンプルな問題です。たとえ知らなくても点の数が15個と固定されているので解答まで難なくたどり着けるでしょう。

私が試しに書いたACコードは下記(Python(3.8.2))です。これぐらいのコードを書くことが求められる問題なのだとイメージするのにお役立てください。

```
A, B = map(int, input().split())
if A == B // 2:
    print("Yes")
else:
    print("No")
```

集計結果は以下の通りです。

| 色 | ユーザ数（人） | 平均値（秒） | 中央値（秒） | 最上位色倍率 |
| :--- | ---: | ---: | ---: | ---: |
| 	青	 | 	233	 | 	90.16	 | 	72	 |	1.00	 |
| 	水	 | 	500	 | 	132.35	 | 	94.5	 |	1.31	 |
| 	緑	 | 	841	 | 	157.46	 | 	117	 |	1.63	 |
| 	茶	 | 	1095	 | 	253.13	 | 	165	 |	2.29	 |
| 	灰	 | 	2387	 | 	641.79	 | 	367	 |	5.10	 |
| 	無	 | 	432	 | 	850.46	 | 	549.5	 |	7.63	 |
| 	**計**	 | 	**5488**	 | 	**436.61**	 | 	**210**	 |	**2.92**	 |

**無**は**unrated**です。つまり初挑戦。
最終行には参考までに色別に分けていない数値を**計**として記載しておきました。

1問でもACしたユーザ数は5,666人で、最初の提出並びにACがA問題であるユーザ数は5,488人でした。大半のユーザはA問題から解き始めるのですね。

こうやって見ると色毎にはっきり差が出るものだと感じます。
中央値で比較した場合、**青ユーザ**は**1分強**でコード提出までを済ませていますが、**灰ユーザ**だと**6分強**かかっている。

ある程度競技プログラミングに慣れているであろう茶色以上のユーザであれば見た瞬間に正答が思い浮かびそうな難易度の問題ですが、それでも、**茶と青の間に2.29という倍以上の速度差**があります。本当に**どこでここまで差が出てるんですか**と言いたくなってしまう。

**問題読んで解答書いて提出までに1分**って冷静に考えて高速すぎて、青コーダの時点ですごすぎます。

ちなみに、最小値は表には載せていませんが**青〜緑**はすべて**20秒台**(20秒〜29秒)でした。AtCoderはコンテスト参加回数を重ねないとレーティングが低めに出ることがあるため、どの色にも**現在の色以上の実力の持ち主**はいるのでしょう。
それにしても20秒って……。

## ABC 284 A問題 Sequence of Strings

- コンテスト名：[AtCoder Beginner Contest 284](https://atcoder.jp/contests/abc284)
- コンテスト時間：2023-01-07(土) 21:00 ~ 2023-01-07(土) 22:40 (100分)
- A問題：[Sequence of Strings](https://atcoder.jp/contests/abc284/tasks/abc284_a)

入力を逆順で出力していくだけです。

試しに書いたACコードは下記(Python(3.8.2))です。

```
N = int(input())
S = [""] * N
for i in range(N):
    S[N - i - 1] = input()
[print(i) for i in S]
```

集計結果は下記の通りです。

| 色 | ユーザ数（人） | 平均値（秒） | 中央値（秒） | 最上位色倍率|
| :--- | ---: | ---: | ---: | ---: |
| 	青	 | 	358	 | 	98.85	 | 	65	 |	1.00	 |
| 	水	 | 	602	 | 	107.35	 | 	77	 |	1.18	 |
| 	緑	 | 	1012	 | 	130.38	 | 	92	 |	1.42	 |
| 	茶	 | 	1352	 | 	167.30	 | 	112	 |	1.72	 |
| 	灰	 | 	2536	 | 	439.23	 | 	216	 |	3.32	 |
| 	無	 | 	870	 | 	592.75	 | 	299	 |	4.60	 |
| 	**計**	 | 	**6730**	 | 	**310.21**	 | 	**138**	 |	**2.12**	 |

ABC 285より全体的に時間は短くなっていますが、ハイレーティングな人ほど速く解く傾向は共通です。

## ARC 153 A問題 AABCDDEFE

- コンテスト名：[AtCoder Regular Contest 153](https://atcoder.jp/contests/arc153)
- コンテスト時間：2023-01-14(土) 21:00 ~ 2023-01-14(土) 23:00 (120分)
- A問題：[AABCDDEFE](https://atcoder.jp/contests/arc153/tasks/arc153_a)

試しに書いたACコードは下記(Python(3.8.2))です。コメントは不要です(私が振り返る際のために書きました)。

```
# S2とS6とS9は他が決まれば一意に決まる
# S1S3S4S5S7S8を6桁の整数とすると100000から999999である
N = int(input())
s = str(N + 99999)  # Nが1のとき100000
print(s[0] + s[0] + s[1] + s[2] + s[3] + s[3] + s[4] + s[5] + s[4])
```

集計結果は下記の通りです。

| 色 | ユーザ数（人） | 平均値（秒） | 中央値（秒） | 最上位色倍率|
| :--- | ---: | ---: | ---: | ---: |
| 	橙	 | 	68	 | 	278.01	 | 	237.5	 |	1.00	 |
| 	黄	 | 	220	 | 	335.15	 | 	285	 |	1.20	 |
| 	青	 | 	281	 | 	509.15	 | 	391	 |	1.65	 |
| 	水	 | 	414	 | 	616.23	 | 	513.5	 |	2.16	 |
| 	緑	 | 	520	 | 	921.94	 | 	709	 |	2.99	 |
| 	茶	 | 	507	 | 	1387.86	 | 	1072	 |	4.51	 |
| 	灰	 | 	853	 | 	2179.88	 | 	1757	 |	7.40	 |
| 	無	 | 	229	 | 	1951.55	 | 	1547	 |	6.51	 |
| 	**計**	 | 	**3092**	 | 	**1287.27**	 | 	**802**	 |	**3.38**	 |

中央値を見ると**2つ上の色がおおよそ1.5倍〜2倍の速度**ですかね。
**青と比較して橙は1.65倍**、**水と比較して黄は1.80倍**、**緑と比較して青は1.81倍**、**茶と比較して水は2.08倍**。

暖色コーダである橙や黄の人は5分もかけていない。化け物すぎます。

これ、コードだけ見るとシンプルに見えますが、緑の私なんかだと、コンテスト中という時間に制限がある中だとなかなか即座に「**6桁の整数として考えられること**」「**文字列を使うと処理しやすいこと**」が思いつかないんですよね。
AtCoderでは「**速く書けて速く動くアルゴリズムをいかにして速く頭の引き出しから取り出すか**」が求められるのですが、それが本当に難しい。

**無**が**灰**より速いというのがABCとは異なる傾向ですが、初めての挑戦でARCを選ぶような方たちなので、かなりの実力者が混ざっているってことですかね。

## ARC 152 A問題 Seat Occupation

- コンテスト名：[AtCoder Regular Contest 152](https://atcoder.jp/contests/arc152)
- コンテスト時間：2022-11-20(日) 21:00 ~ 2022-11-20(日) 23:00 (120分)
- A問題：[Seat Occupation](https://atcoder.jp/contests/arc152/tasks/arc152_a)

試しに書いたACコードは下記(Python(3.8.2))です。これももちろんコメントは不要です。

```
# 1席空けで座っていって端まで行った状態で2人組が来たなら座れない
N, L = map(int, input().split())
a = list(map(int, input().split()))
count = 0
for val in a:
    count += val
    if count > L and val == 2:
        print("No")
        exit()
    count += 1  # 1席空ける
print("Yes")
```

集計結果は下記の通りです。

| 色 | ユーザ数（人） | 平均値（秒） | 中央値（秒） | 最上位色倍率 |
| :--- | ---: | ---: | ---: | ---: |
| 	橙	 | 	49	 | 	387.69	 | 	298	 |	1.00	 |
| 	黄	 | 	203	 | 	469.89	 | 	383	 |	1.29	 |
| 	青	 | 	252	 | 	607.60	 | 	512.5	 |	1.72	 |
| 	水	 | 	298	 | 	910.30	 | 	736	 |	2.47	 |
| 	緑	 | 	342	 | 	1208.69	 | 	996	 |	3.34	 |
| 	茶	 | 	230	 | 	1942.94	 | 	1487	 |	4.99	 |
| 	灰	 | 	249	 | 	2570.02	 | 	2063	 |	6.92	 |
| 	無	 | 	59	 | 	1846.69	 | 	1284	 |	4.31	 |
| 	**計**	 | 	**1682**	 | 	**1277.00**	 | 	**818**	 |	**2.74**	 |

この問題も**2つ上の色がおおよそ1.5倍〜2倍の速度**というのは同様ですかね。**青と比較して橙は1.72倍**、**黄と比較して水は1.91倍**、**緑と比較して青は1.94倍**、**茶と比較して水は2.02倍**。

**無**が**灰**より速いという傾向もARC 153同様です。

## AGC 060 A問題 No Majority

- コンテスト名：[AtCoder Grand Contest 060](https://atcoder.jp/contests/agc060)
- コンテスト時間：2022-12-25(日) 21:00 ~ 2022-12-26(月) 00:00 (180分)
- A問題：[No Majority](https://atcoder.jp/contests/agc060/tasks/agc060_a)

お試しコードはなしで。実際にユーザたちが提出したコードは[こちら](https://atcoder.jp/contests/agc060/submissions?f.Task=agc060_a&f.LanguageName=&f.Status=AC&f.User=)で見ることができますが、ご自身で解いてみていただいても楽しいかと(化け物度合いを感じてみてほしい)。

集計結果は下記の通りです。

| 色 | ユーザ数（人） | 平均値（秒） | 中央値（秒） | 最上位色倍率|
| :--- | ---: | ---: | ---: | ---: |
| 	赤	 | 	50	 | 	418.52	 | 	351	 |	1.00	 |
| 	橙	 | 	73	 | 	578.96	 | 	443	 |	1.26	 |
| 	黄	 | 	194	 | 	798.46	 | 	628.5	 |	1.79	 |
| 	青	 | 	183	 | 	1478.88	 | 	1134	 |	3.23	 |
| 	水	 | 	180	 | 	2983.92	 | 	2426.5	 |	6.91	 |
| 	**計**	 | 	**680**	 | 	**1508.58**	 | 	**860.5**	 |	**2.45**	 |

赤は橙をさらに上回る速度なのだと示されました。**赤は橙の1.26倍の速度、黄の1.79倍の速度、青の3.23倍の速度**。青でも私からすれば化け物なのに。

## AGC 059 A問題 My Last ABC Problem

- コンテスト名：[AtCoder Grand Contest 059](https://atcoder.jp/contests/agc059)
- コンテスト時間：2022-12-04(日) 21:00 ~ 2022-12-05(月) 00:00 (180分)
- A問題：[My Last ABC Problem](https://atcoder.jp/contests/agc059/tasks/agc059_a)

本問題もお試しコードはなしで。ユーザが提出したコードは[こちら](https://atcoder.jp/contests/agc059/submissions?f.Task=agc059_a&f.LanguageName=&f.Status=AC&f.User=)です。

集計結果は下記の通りです。

| 色 | ユーザ数（人） | 平均値（秒） | 中央値（秒） | 最上位色倍率 |
| :--- | ---: | ---: | ---: | ---: |
| 	赤	 | 	39	 | 	1506.59	 | 	1104	 |	1.00	 |
| 	橙	 | 	39	 | 	2480.79	 | 	1997	 |	1.81	 |
| 	黄	 | 	74	 | 	3121.01	 | 	2716.5	 |	2.46	 |
| 	青	 | 	51	 | 	3762.75	 | 	3300	 |	2.99	 |
| 	水	 | 	19	 | 	4941.21	 | 	4732	 |	4.29	 |
| 	**計**	 | 	**222**	 | 	**3028.14**	 | 	**2453**	 |	**2.22**	 |

こちらも色が上がるほどに中央値は小さくなっていきます。上には上がいるというのを痛感させられる結果です。

ちなみに、この回はA問題の難易度が高かったからか、B問題の正答者数の方がA問題の正答者数よりも多かったです。

## 最後に

高橋様のこの投稿を実感する結果でした。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">【競プロの各色に対する認識オススメ】<br>・２色上は人外だと思うのが大切！比較しちゃだめ！１色上に追いついたところで人間に戻してあげよう！<br>・１色上は強い人！目標にするのは良いけど勝てなくて当たり前！いつかは追いつけたらいいなくらいに思おう！<br>・同色でも成長がヤバいやつはやっぱり人外！</p>&mdash; chokudai(高橋 直大)🐙🔥@AtCoder社長 (@chokudai) <a href="https://twitter.com/chokudai/status/1277503196684943361?ref_src=twsrc%5Etfw">June 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。