GPT-4 vs AtCoder

## はじめに

GPT-4がAtcoderの問題(ABC)をどの程度解けるか検証してみました。

今回はGPT-4単体の能力を見たいので人からの手助けは最低限にし、どの程度のレートになるかも確認したいので解くのにかかった時間も大まかに計算します。

前提は以下の通りです。

## 前提
プロンプト入力は最初の入力を含めて1問題あたり**最大5回まで**とする(5回以下やってダメだった場合その問題はあきらめる。)
また、Aから順番に解かせていき2問連続で解けなかった場合は次の問題は解かない(でもDまではやる)
1. 以下のようなプロンプト※1で最初に指示を出す(言語はc++)
2. 出力されたコードをそのままAtcoderで提出する
    ⇒ 正解ならば終了
3. 提出したコードのテストケース結果を与えてコードを再出力させる。入力文は「テストケースn件中、AC(Accepted)x件、WA(Wrong Answer)y件、CE(Compile Error)z件、TLE(Time Limit Exceeded)w件、RE (Runtime Error)v件でした。コードを修正してください」。これを全ACになるまで繰り返す。
4. 時間はプロンプトの入出力1回で1分、提出ペナルティ1回で5分として、コンテスト上でのパフォーマンスを計算する。

※1 プロンプト例(abc287a)
```
以下のAtcoderの問題をc++で解いてください（実行制限時間2secに間に合うようにできるだけ高速な解法を作成してください）。
$マークで囲まれた部分は数式を表します。
また、コードを記載した後に、問題文の解釈と解法の指針とコードの説明を記載してください。

配点 : $100$ 点

## 問題文
ある提案に対し、$N$ 人の人が賛成か反対かを表明しています。なお、$N$ は奇数です。
$i \, (i = 1, 2, \dots, N)$ 番目の人の意見は文字列 $S_i$​ で表され、$S_i = $​ For のとき賛成しており、$S_i = $​ Against のとき反対しています。
過半数の人がこの提案に賛成しているかどうかを判定してください。

## 制約
$N$ は $1$ 以上 $99$ 以下の奇数
全ての $i = 1, 2, \dots, N$ に対し、$S_i = $​ For または $S_i = $​ Against

## 入力
入力は以下の形式で標準入力から与えられる。
$N$
$S_1$​
$S_2$​
$\vdots$
$S_N$​

## 出力
$N$ 人のうち過半数が提案に賛成しているならば Yes、そうでなければ No と出力せよ。

## 入力例 1 
3
For
Against
For

## 出力例 1 
Yes

提案に賛成している人数は $2$ 人であり、これは半数を超えているので Yes と出力します。

## 入力例 2 
5
Against
Against
For
Against
For

## 出力例 2 
No

提案に賛成している人数は $2$ 人であり、これは半数以下なので No と出力します。

## 入力例 3 
1
For

## 出力例 3 
Yes
```

## 検証結果
|ABC名|問題|検証結果(〇 or ×)|ペナ数|推定経過時間(ペナ含む)|difficulty※2|
|:---:|:---:|:---:|---:|:---:|---:|
|287|A|〇|0|1分|11|
|287|B|〇|0|1分|45|
|287|C|〇|1|7分|466|
|287|D|×|-|-|796|
|287|E|〇|3|19分|1093|
|287|F|×|-|-|2034|
|287|G|×|-|-|2180|
|||||||
|288|A|〇|0|1分|6|
|288|B|×|-|-|44|
|288|C|×|-|-|436|
|288|D|×|-|-|1757|
|||||||
|289|A|〇|0|1分|14|
|289|B|×|-|-|225|
|289|C|〇|0|1分|396|
|289|D|〇|1|6分|551|
|289|E|×|-|-|1318|
|289|F|×|-|-|2100|
|||||||
|290|A|〇|0|1分|9|
|290|B|〇|0|1分|22|
|290|C|×|-|-|225|
|290|D|×|-|-|1036|
|||||||
|291|A|〇|0|1分|8|
|291|B|〇|0|1分|32|
|291|C|〇|0|1分|188|
|291|D|×|-|-|720|
|291|E|×|-|-|1069|
|||||||
|292|A|〇|0|1分|7|
|292|B|〇|0|1分|39|
|292|C|×|-|-|444|
|292|D|〇|2|13分|579|
|292|E|×|-|-|1272|
|292|F|×|-|-|1522|
|||||||
|293|A|〇|0|1分|12|
|293|B|×|-|-|65|
|293|C|×|-|-|431|
|293|D|×|-|-|830|
|||||||
|294|A|〇|0|1分|8|
|294|B|〇|0|1分|25|
|294|C|〇|1|7分|127|
|294|D|×|-|-|385|
|294|E|〇|0|1分|792|
|294|F|×|-|-|1891|
|294|G|×|-|-|1702|
|||||||
|295|A|〇|0|1分|15|
|295|B|〇|0|1分|156|
|295|C|〇|0|1分|122|
|295|D|×|-|-|939|
|295|E|×|-|-|2157|
|||||||
|296|A|〇|0|1分|14|
|296|B|〇|0|1分|31|
|296|C|×|-|-|162|
|296|D|×|-|-|999|
|||||||

※2 Atocer Problemsより


|ABC名|点数|経過時間(ペナ含む)|推定パフォ※3|
|:---:|---:|:---:|---:|
|287|1100|28分|1104|
|288|100|1分|113|
|289|800|8分|675|
|290|300|2分|305|
|291|600|3分|749|
|292|700|15分|722|
|293|100|1分|163|
|294|1100|10分|817|
|295|600|3分|978|
|296|300|2分|261|
|平均|570|-|**588.7**|

※3 似たような結果であった人のパフォーマンスを採用する

## まとめ
ABC287~296の10コンテストを解かせた際の平均パフォは**588..7**!!

##### 感じたこと
- 単体の性能といったが、サンプルが合うまで実験を繰り返せる環境(人間と同じ環境)があれば、もう少しレートは上がりそう
- プロンプトの与え方によっては、もっと良くなるかも？？
- 一段思考を挟む必要のある問題を解くのはまだ難しそう
- 人間がしそうな誤読は、GPTも誤読する。
- 毎回修正はしてくれる。微修正なものから大きな変更までいろいろ。
- ACにはならなくても方針は良いものもある
- ごくたまにあきらめる
    - 295d 「私が以前提供したコードと同じですが、TLEが発生していることを考慮すると、計算量の削減が必要です。しかし、この問題は解くのが難しいため、私は改善策を提案できません。私の知識が2021年9月までのものであることを考慮してください。新しい技術やライブラリが利用可能であれば、それらを検討してみてください。」