isyumi_netブログ

isyumi_netがプログラミングのこととかを書くブログ

僕はプログラミングがとても速いのだ

 

概要

僕がいかにプログラミングが速いかについてAtCoderの成績を元に説明する。
どちらかといえば、AtCoderのことをよく知らない人向けに書いた。ところどころ厳密ではない書き方をしたが、わからない人を混乱させないための言い回しなので、詳しい方はご勘弁願いたい。
正直言って、自分でこんな記事を書くのはダサくて恥ずかしい。
でも、自分で言わないと誰もわかってくれないから書く。
なんでわかってもらう必要があるかと言うとオチンギンガ……

経緯

僕はAtCoderで水色である。
正直、水色というのは凡庸な成績だ。
なぜこのような成績になってしまうかと言うと、僕に難問を解く力がないからだ。
逆に、簡単な問題を速く正確に解くのは得意だ。
なので、AtCoderのレートではなく簡単な問題を解く速さと正確さをアピールしたかった。

前提

AtCoderの難易度について

AtCoder界隈では問題の難しさを色で区分する習慣がある。
これは、主観ではなく解答できた人のレーティングを元に算出した客観的な分類だ。
簡単な順に

  1. 灰色
  2. 茶色
  3. 緑色
  4. 水色
  5. 青色
  6. 黄色
  7. 橙色
  8. 赤色

である。
灰色が一番簡単である。
だいたいどのくらいのレベルかと言うと、灰色の中で一番難しいのがこのくらいの問題である。

X,Y,H,Mが与えられる。
時計の長針と短針の長さがそれぞれXcm,Ycmである。
H時M分の時、2つの針の先の距離は何cmか?

決して難問ではないが、そうそう即答できるわけでもないと思う。
AtCoder未経験者が想像する「一番簡単な問題」よりは難しいと思う。
諸説あるが、大体普通のお仕事でWebアプリケーションを開発する仕事の難度は高くて茶色前後だと思う。
ちなみに、僕はこの問題を10分で解いた。参加者の中央値は50分だ。
(それ以前の問題を解くのにかかった時間を引いた)

調査方法

AtCoder Beginner Contestの中で直近26回のコンテストを対象にする。
これは、これまで僕が出場した全てのAtCoder Beginner Contestだ。

問題は緑問題以下を対象とする。
これはざっくり言って、参加者の上位1/3が正解できる難易度の問題だ。

制限時間以内に正答できなかった人は制限時間である6000秒で正答できたとみなす。

集団の偏りについては、AtCoderの参加者は世間一般のプログラマーよりプログラミングが上手なのか下手なのかは色んな意見があるが、ここではだいたい一緒とみなして話をすすめる。
また、そもそも他の参加者は全力を尽くしているのかという問題があるが、そこは考えないようにする。
例えば、AtCoderのルールでは強豪ユーザーはAtCoder Beginner Contestでいい点を取るメリットは全くないが、彼らも一生懸命問題を解いていると想定する。

解答の速度と正確さを評価することにする。

速さ

解答の速さは

  • 自分が正答するのにかかった時間を他の参加者の中央値と比べる
  • 自分が正答するのにかかった時間が参加者の上位何%か調べる

正確さ

AtCoderでは、解答を提出するとその場で正誤がわかる。
誤答をするとスコアが下がるので、一般的に参加者は極力誤答を提出せずに正答を提出しようとする。
なので、正答するのに要した誤答の数が少ないほど正確なプログラミングが出来ると言える。

結果

解答の速度

問題を解いた時間をグラフにした。

f:id:isyumi-net:20200820174842p:plain

左に行くほど簡単な問題である。
茶色の真ん中あたりからオレンジのグラフが全て6000に張り付いている。そもそも半分の人は解けていないのでこういうグラフになっている。
これを見ると、大体中央値の1/3くらいの速度で正答できていることがわかる。

 

次に、これは解答速度が参加者の内上位何%だったかを表したグラフだ。

f:id:isyumi-net:20200820174901p:plain

大体、上位15%であることがわかる。
計算した所

  • 灰色問題までは平均13%
  • 緑色問題までは平均18%

であった。

解答の正確さ

僕が一度も間違えずに提出できたのは
100回中85回 で、成功率は85% であった。
これは48,990人中3,4662位で、上位7%である。
中央値は50%なので、1.7倍正確にプログラミングができると言える。

結論

簡単な問題(とはいえ、一般的な仕事の基準では十分難問)を解くことについて、僕はこのくらいのスキルだと言える。

  1. 僕のプログラミングの速度は、一般的なプログラマーの中で上位15%くらいである
  2. 僕のプログラミングの速度は、一般的なプログラマーの3倍くらいである
  3. 僕のプログラミングの正確さは、一般的なプログラマーの上位6%くらいである
  4. 僕のプログラミングの正確さは、一般的なプログラマーの1.7倍くらいである