ベンチマーク · coding
LiveCodeBench
LiveCodeBench は、大規模言語モデルが competitive programming の問題をどれだけうまく解けるかを評価するもので、学習データの汚染を避けるために最近のコンテストから継続的に集めたコーディング問題を使います。中心となる指標は pass@1、すなわちモデルが最初の一回で正しく解けた問題の割合です。
詳しく見る
- 例
- 典型的な項目はコンテスト形式のコーディング問題です。たとえば、整数の配列が与えられたとき、最長の狭義単調増加部分列の長さを返す関数を書く、といった問題を、モデルは動作するコードを生成して解かなければなりません。
- 採点方法
- 生成された各解答は問題のテストケースで実行され、pass@1 はモデルの最初の提出がすべてのテストに通った問題の割合です。
- 検証方法
- 生成されたコードがその問題のすべての隠しテストと公開テストに通ると、解答は自動的に受理されます。人手による判定や厳密なテキスト一致は行われません。
- 重要な理由
- 問題がモデルの学習締め切り後に公開されたコンテストから取られているため、LiveCodeBench は暗記した答えではなく本当の推論力とコーディング力を測ります。そのため、汚染に強い信頼できるコーディング能力の指標となっています。
解説付きの例
課題
競技プログラミング形式(stdin/stdout)。n 個の整数が与えられ、i < j かつ nums[i] + nums[j] が偶数となる組 (i, j) の個数を数える。入力:1 行目に n、2 行目にスペース区切りの n 個の整数;その個数を出力する。
解答
import sys
def main():
data = sys.stdin.read().split()
n = int(data[0])
nums = list(map(int, data[1:1 + n]))
odd = sum(x % 2 for x in nums)
even = n - odd
print(odd * (odd - 1) // 2 + even * (even - 1) // 2)
main()
解説
和が偶数になるのは 2 つの数の偶奇が一致するときだけなので、答えは C(evens, 2) + C(odds, 2) となり、偶奇の集計は O(n) で済む。LiveCodeBench はモデルのプログラムを隠しユニットテストで実行し pass@1 で採点する——全テストに通ったときだけ正解となる。