LLMによるUniversal Cupの難易度推定

と固そうなタイトルを付けたが、どちらかというと

概要

Universal Cupなどの(英語/5時間)コンテストに取り組むとき、最初に取り組む問題をどのように決定しますか? 私の場合は適当に問題を眺めて"良さそう"な問題を探して読みます。そして、体感ですがこの方法で簡単な問題を見つけられる可能性はそこそこ高い気がしています。

人間が適当に眺めて探せるなら、当然LLMも探すことが可能でしょう。

作り方

ChatGPTにはマイGPTという機能があるので、これを使っていきます (GPTを探す > 作成する)。

プロンプトを登録するだけです。難易度推定だけでは味気ないので、問題ジャンルやおすすめ割り当ても出力してみましょう。<メンバーA, B, C>や得意の説明は適時書き換えてください。

このGPTはプログラミングコンテストの問題文を受け取り、各問題についての要約を出力します。まず、問題文はpdfの形式で受け取ります。pdf以外のものが渡されたら「問題文はPDFで入力してください」と言ってください。

また、英語の問題文が与えられることがありますが、出力は全て日本語で行ってください。

与えられたPDFの各問題について、次の情報を出力します。

まず問題番号を出力します。「A」や「5」のように一文字だけ出力してください。問題タイトルを出力する必要はありません。

1. 問題ジャンル: 「数え上げ, 998244353, グラフ, 木, クエリ」などその問題のジャンルを簡潔にいくつかの単語で出力してください。
2. おすすめ担当: この問題は<メンバーA>, <メンバーB>, <メンバーC>のうちだれが得意そうかを出力してください
  - <メンバーA>: 木やグラフやクエリの問題が得意です。特にQ = 200,000のような制約を含む場合優先的に割り当ててください。
  - <メンバーB>: パズルの問題が得意です。また全体的にいろいろな問題が得意です。他二人の割り当てが多すぎる場合など、適当に問題を割り当ててよいです。
  - <メンバーC>: 幾何の問題が本当に大好きです。幾何の問題は必ず<メンバーC>に割り当ててください。また、実装が重い問題も大好きです。問題がいかにもめんどくさそう(例えば、問題文が非常に長いなど)な場合も必ず<メンバーC>に割り当ててください。あと数え上げ、つまり問題文に998244353や1000000007が含まれている問題が得意です。ですが一番優先度が高いのは幾何と重実装であることに留意してください。
3. 予想難易度: 問題の予想難易度を「easy, easy-mid, mid, mid-hard, hard」で見積もってください。
  - 幾何は難易度が高い傾向があります。


出力はmarkdown形式で行ってください。コピペして使うので先頭や末尾に追加の文章は出さないでください。

===== 出力例(ここから) =====

# ICPC Yokohama Regional 2024

## A
- ジャンル: パズル
- おすすめ担当: <メンバーB>
- 予想難易度: easy

## B
- ジャンル: 木, クエリ
- おすすめ担当: <メンバーA>
- 予想難易度: mid

## C
- ジャンル: 幾何, 重実装
- おすすめ担当: <メンバーC>
- 予想難易度: hard

===== 出力例(ここまで) =====

後は完成したものにコンテスト開始とともにpdfを投げつけるだけです。

結果

直近3回の結果は次の通りです

問題名    予想難易度 AC数
29      
A   hard    0
B   mid-hard    330
C   mid 427
D   mid 232
E   mid-hard    101
F   mid-hard    51
G   hard    258
H   mid 16
I   mid-hard    414
J   hard    51
K   mid-hard    6
L   mid-hard    18
M   hard    11
        
        
28      
A   mid 28
B   mid-hard    5
C   mid 89
D   mid-hard    0
E   mid-hard    1
F   mid 25
G   mid-hard    72
H   mid-hard    31
I   mid 1
J   hard    9
K   mid-hard    18
        
27      
A   easy-mid    4
B   mid 29
C   mid-hard    62
D   hard    21
E   mid 140
F   mid-hard    31
G   hard    135
H   mid 73
I   mid 139
J   hard    17
K   mid-hard    35
L   mid-hard    5
M   easy-mid    144

これをプロットさせたり、相関係数を出させたりしたものが次です。

【相関係数の結果 (easy=0, easy‑mid=1, mid=2, mid‑hard=3, hard=4 / from scipy.stats import pearsonr)】
コンテスト29: Pearson r = -0.339 (p = 0.257)
コンテスト28: Pearson r = -0.301 (p = 0.368)
コンテスト27: Pearson r = -0.262 (p = 0.387)
全体        : Pearson r = -0.122 (p = 0.47)

相関係数-0.3なので結構いけてそう と思いきやプロットを見てみるとなんともいえなくて、むずい