challenge-coding-004
Suite: coding
Finish: stop
Prompt
只输出 Python 代码,不要解释。实现 solve(capacity: int, ops: list[str]) -> list[int],模拟 LRU cache。ops 包含 "put key value" 和 "get key"。get 返回 value,不存在返回 -1。put 已存在 key 要更新并变成最近使用。容量为 0 时所有 get 都返回 -1。
Standard Answer / Scoring Expectation
Reference tests:
ops = ['put a 1', 'put b 2', 'get a', 'put c 3', 'get b', 'get a', 'get c']
assert solution.solve(2, ops) == [1, -1, 1, 3]
assert solution.solve(0, ['put a 1', 'get a']) == [-1]
assert solution.solve(1, ['put a 1', 'put a 2', 'get a']) == [2]
Mistake Analysis
Failure type: runtime_type_assumption
题目里的 cache key 是字符串,例如 `a`、`b`、`c`,但模型把 key 强行写成 `int(parts[1])`。测试一遇到 `put a 1` 就在解析 `a` 时抛出 ValueError。根因是模型擅自补了“key 是整数”的类型假设。
Scorer Details
{
"returncode": 1,
"stdout": "",
"stderr": "Traceback (most recent call last):\n File \"/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-dcom7cj8/test_solution.py\", line 4, in <module>\n assert solution.solve(2, ops) == [1, -1, 1, 3]\n ^^^^^^^^^^^^^^^^^^^^^^\n File \"/private/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-dcom7cj8/solution.py\", line 20, in solve\n key = int(parts[1])\n ^^^^^^^^^^^^^\nValueError: invalid literal for int() with base 10: 'a'\n"
}
Output
```python
from collections import OrderedDict
def solve(capacity: int, ops: list[str]) -> list[int]:
if capacity == 0:
return [-1 for op in ops if op.startswith("get")]
cache = OrderedDict()
result = []
for op in ops:
parts = op.split()
if parts[0] == "get":
key = int(parts[1])
if key in cache:
cache.move_to_end(key)
result.append(cache[key])
else:
result.append(-1)
else: # put
key = int(parts[1])
value = int(parts[2])
if key in cache:
cache[key] = value
cache.move_to_end(key)
else:
cache[key] = value
if len(cache) > capacity:
cache.popitem(last=False)
return result
```
challenge-debugging-003
Suite: debugging
Finish: stop
Prompt
下面分页代码会漏掉最后不足 page_size 的一页。请指出 bug,并给出最小修复。最后单独一行写 FIX: <修复后的 range 行>。
```python
def pages(items, page_size):
out = []
for start in range(0, len(items) - page_size, page_size):
out.append(items[start:start + page_size])
return out
```
Standard Answer / Scoring Expectation
Expected regex pattern:
FIX:\s*`?\s*for\s+start\s+in\s+range\(0,\s*len\(items\),\s*page_size\)\s*:
Mistake Analysis
Failure type: regex_miss
模型已经定位到 `range` 的 stop 参数应从 `len(items) - page_size` 改为 `len(items)`,核心 bug 判断正确。但题目要求最后单独输出“修复后的 range 行”,当前 regex 期望完整代码行 `for start in range(0, len(items), page_size):`;模型只写了 `FIX: range(0, len(items), page_size)`,缺少 `for start in` 和结尾冒号,因此被判为 regex miss。根因是最终 FIX 行格式不完整,而不是分页逻辑没看懂。
Scorer Details
{
"pattern": "FIX:\\s*`?\\s*for\\s+start\\s+in\\s+range\\(0,\\s*len\\(items\\),\\s*page_size\\)\\s*:"
}
Output
Bug:`range` 的结束参数写成了 `len(items) - page_size`,导致循环在到达最后一页(或不足一页的剩余部分)的起始索引之前就提前终止。当 `len(items)` 正好是 `page_size` 的整数倍时,会直接漏掉最后一页;有余数时也会漏掉剩余部分。
最小修复:将 `range` 的结束参数改为 `len(items)`,让循环能遍历到最后一个可能的起始索引;配合切片 `items[start:start + page_size]` 的自动越界截断特性,即可正确包含最后不足一页的数据。
FIX: range(0, len(items), page_size)
challenge-debugging-005
Suite: debugging
Finish: stop
Prompt
下面缓存装饰器会把不同参数的调用混在一起。请指出 bug,并给出最小修复。最后单独一行写 FIX: <修复后的 key 赋值行>。
```python
cache = {}
def memo(fn):
def wrapper(*args, **kwargs):
key = fn.__name__
if key not in cache:
cache[key] = fn(*args, **kwargs)
return cache[key]
return wrapper
```
Standard Answer / Scoring Expectation
Expected regex pattern:
FIX:\s*`?\s*key\s*=\s*\(fn\.__name__,\s*args,\s*(?:tuple\(sorted\(kwargs\.items\(\)\)\)|frozenset\(kwargs\.items\(\)\))\)\s*`?
Mistake Analysis
Failure type: regex_miss
模型正确知道缓存 key 必须包含调用参数,也把 kwargs 排序后放进 key 里;失败点在最终 key 形式。当前标准答案期望 `key = (fn.__name__, args, tuple(sorted(kwargs.items())))` 或等价 frozenset 写法,模型输出的是 `key = (fn, args, tuple(sorted(kwargs.items())))`。用函数对象 `fn` 在很多场景下也能区分函数,但没有命中本题的固定 regex。根因更偏评分模式未覆盖这个等价实现,而不是模型完全没修好缓存参数混淆。
Scorer Details
{
"pattern": "FIX:\\s*`?\\s*key\\s*=\\s*\\(fn\\.__name__,\\s*args,\\s*(?:tuple\\(sorted\\(kwargs\\.items\\(\\)\\)\\)|frozenset\\(kwargs\\.items\\(\\)\\))\\)\\s*`?"
}
Output
Bug: 当前 `key` 仅使用函数名 `fn.__name__`,未包含调用参数,导致不同参数的函数调用会共用同一缓存条目,返回错误的结果。
最小修复:将 `key` 构造为包含函数名、位置参数和关键字参数的元组,以确保不同参数调用对应不同的缓存键。
FIX: key = (fn.__name__, args, tuple(kwargs.items()))
challenge-debugging-008
Suite: debugging
Finish: stop
Prompt
下面代码期望 finally 后仍保留 try 中返回值,但实际总是返回 None。请指出 bug,并给出最小修复。最后单独一行写 FIX: <要删除或替换的 finally 行说明>。
```python
def read_value():
try:
return 42
finally:
return None
```
Standard Answer / Scoring Expectation
Accepted answers:
- 删除 finally 中的 return None
- 去掉 finally 的 return None
- 不要在 finally 里 return None
- remove return None
- 去掉 finally 中的 return None
- 删除或替换 finally 中的 return None
- 去掉 finally 中的 `return None`
- 删除或替换 finally 中的 `return None`
- 删除 finally 块中的 `return None`
- 删除 finally 块中的 return None
- 删除 finally 中的 `return None`
- 删除 `finally` 块中的 `return None`
- 删除 `finally` 中的 `return None`
- 删除 `finally: return None`
- 将 `finally:` 中的 `return None` 删除
- finally 中的 return None 删除
- finally: 中的 return None 删除
- 删除 finally 块中的 'return None'
- 删除 finally 子句中的 `return None`
- 删除 finally 子句中的 return None
- delete the line `return None` inside the finally block
- delete the line return None inside the finally block
- finally 块不应包含 return 语句
- finally 块不应包含 return
- finally 不应包含 return
Mistake Analysis
Failure type: missing_accepted_answer
模型正确指出 `finally` 里的 `return None` 会覆盖 `try` 中的 `return 42`,修复方向也是删除这个 return。失败点在最后的 `FIX:` 行只写了 `删除 return None`,没有明确说“删除 finally 中的 return None”。当前 contains_any scorer 只接受包含 finally 位置的固定表达;模型正文里虽解释了 finally,但最终短答案没有命中可接受短语。根因是最终修复说明过短/评分短语覆盖不足,而不是调试判断错误。
Scorer Details
{
"matched": []
}
Output
### Bug原因
Python执行逻辑中,`try`块的`return`会先暂存待返回的值,随后执行`finally`块;若`finally`块存在`return`语句,会直接覆盖之前暂存的返回值,因此原本要返回的`42`被`finally`的`return None`覆盖,最终始终返回`None`。
### 最小修复
删除`finally`块中的`return None`语句,`finally`仅用于执行资源清理等必要逻辑,无需返回值。
FIX: 删除finally块中的return None语句
challenge-rag-003
Suite: rag_long_context
Finish: stop
Prompt
只根据资料回答。
资料:一次评测中,K 模型在 smoke set 上 7/7,通过率 100%;在 hard set 上原始结果 47/50,其中 2 题后来被认定为题面歧义,单独复测通过。另有 1 题因 reasoning tokens 用尽而空输出。
问题:更公平的文字结论应该如何描述 K 模型这次 hard set 表现?
Standard Answer / Scoring Expectation
Required phrases: 题面歧义
At least one from each group: 47/50 / 47 题 / 47题;空输出 / 输出为空 / 未输出
Forbidden phrases: 满分、完全失败
Length guidance (diagnostic only): min=n/a, max=240
Mistake Analysis
Failure type: missing_required_info
模型回答没有覆盖评分规则要求的完整证据链。必须出现的关键信息:题面歧义;每组至少一个依据表达:47/50 / 47 题 / 47题。这通常表示答案方向可能对,但没有把资料依据说清楚。
Scorer Details
{
"missing": [
"题面歧义"
],
"missing_any": [
[
"47/50",
"47 题",
"47题"
]
],
"present_forbidden": [],
"char_count": 78,
"length_ok": true,
"length_scored": false
}
Output
K模型在hard set原始作答中正确完成47道题,另有2道题因题面存在歧义,后续单独复测后通过;剩余1道题因推理token耗尽导致空输出,未获得有效得分。
challenge-coding-010
Suite: coding
Finish: length
Prompt
只输出 Python 代码,不要解释。实现 solve(expr: str) -> int。expr 只包含非负整数、+、-、空格和括号,计算表达式结果。不要使用 eval。
Standard Answer / Scoring Expectation
Reference tests:
assert solution.solve('1 + 2 - 3') == 0
assert solution.solve('10 - (2 + 3) + 4') == 9
assert solution.solve('(1+(4+5+2)-3)+(6+8)') == 23
Mistake Analysis
Failure type: empty_output_length
模型耗尽输出预算后没有留下任何正文,形成空输出。评分器无法找到答案或 `solve` 函数,所以失败。这类问题应归因于输出预算/过度生成,而不是某个具体算法步骤写错。
Scorer Details
{
"returncode": 1,
"stdout": "",
"stderr": "Traceback (most recent call last):\n File \"/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-udyf9kc6/test_solution.py\", line 3, in <module>\n assert solution.solve('1 + 2 - 3') == 0\n ^^^^^^^^^^^^^^\nAttributeError: module 'solution' has no attribute 'solve'\n"
}
Output
challenge-coding-014
Suite: coding
Finish: stop
Prompt
只输出 Python 代码,不要解释。实现 solve(nums: list[int]) -> int。返回删除恰好一个元素后,剩余数组的最大连续子数组和。nums 长度至少为 2,可以全为负数。
Standard Answer / Scoring Expectation
Reference tests:
assert solution.solve([1,-2,0,3]) == 4
assert solution.solve([1,-2,-2,3]) == 3
assert solution.solve([-1,-1,-1]) == -1
assert solution.solve([2,1,-2,3]) == 6
Mistake Analysis
Failure type: code_assertion_failure
模型采用了左右最大子数组拼接法,但没有正确覆盖“删除后可以只取一侧子数组”的情况。在 `[1,-2,-2,3]` 中,最佳做法是删除一个 `-2` 后取右侧 `[3]`,答案为 3;模型只算出 2,说明动态规划状态没有完整表达“恰好删除一个元素后的最大连续和”。
Scorer Details
{
"returncode": 1,
"stdout": "",
"stderr": "Traceback (most recent call last):\n File \"/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-fir1rhdb/test_solution.py\", line 4, in <module>\n assert solution.solve([1,-2,-2,3]) == 3\nAssertionError\n"
}
Output
```python
def solve(nums: list[int]) -> int:
n = len(nums)
left = [0] * n
left[0] = nums[0]
for i in range(1, n):
left[i] = max(nums[i], left[i-1] + nums[i])
right = [0] * n
right[-1] = nums[-1]
for i in range(n-2, -1, -1):
right[i] = max(nums[i], right[i+1] + nums[i])
ans = max(right[1], left[-2])
for i in range(1, n-1):
ans = max(ans, left[i-1] + right[i+1])
return ans
```
challenge-rag-006
Suite: rag_long_context
Finish: stop
Prompt
只根据资料回答。
资料:一次失败分析显示,模型输出了 key = int(parts[1]),但测试数据里的 key 是字符串 a、b、c。报告认为这是“擅自补类型假设”,不是 token 截断。
问题:这次失败的根因是什么?
Standard Answer / Scoring Expectation
Required phrases: key
At least one from each group: 字符串 / 类型不匹配;整数 / int;类型假设 / 假设 key 为整数 / 假设 key 是整数 / key 为整数类型
Length guidance (diagnostic only): min=n/a, max=120
Mistake Analysis
Failure type: missing_required_info
模型回答没有覆盖评分规则要求的完整证据链。每组至少一个依据表达:类型假设 / 假设 key 为整数 / 假设 key 是整数 / key 为整数类型。这通常表示答案方向可能对,但没有把资料依据说清楚。
Scorer Details
{
"missing": [],
"missing_any": [
[
"类型假设",
"假设 key 为整数",
"假设 key 是整数",
"key 为整数类型"
]
],
"present_forbidden": [],
"char_count": 79,
"length_ok": true,
"length_scored": false
}
Output
根因是模型未经授权擅自假设key需要为int类型,对key执行了类型转换操作,输出不符合测试数据要求的字符串类型key的规则,且该问题并非token截断导致。
challenge-coding-020
Suite: coding
Finish: length
Prompt
只输出 Python 代码,不要解释。实现 solve(text: str) -> dict,解析 Markdown front matter。只有第一行正好是 --- 时才解析,直到下一行 --- 结束;每行 key: value,key 和 value 两侧 trim;形如 [a, b] 的 value 返回字符串列表;其他 value 返回字符串。没有完整 front matter 返回 {}。
Standard Answer / Scoring Expectation
Reference tests:
text='---\ntitle: Test\ntags: [ai, bench, v0]\ndraft: false\n---\nbody'
assert solution.solve(text) == {'title':'Test','tags':['ai','bench','v0'],'draft':'false'}
assert solution.solve('hello\n---\na: b') == {}
assert solution.solve('---\na: 1') == {}
Mistake Analysis
Failure type: empty_output_length
模型耗尽输出预算后没有留下任何正文,形成空输出。评分器无法找到答案或 `solve` 函数,所以失败。这类问题应归因于输出预算/过度生成,而不是某个具体算法步骤写错。
Scorer Details
{
"returncode": 1,
"stdout": "",
"stderr": "Traceback (most recent call last):\n File \"/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-64fjwovt/test_solution.py\", line 4, in <module>\n assert solution.solve(text) == {'title':'Test','tags':['ai','bench','v0'],'draft':'false'}\n ^^^^^^^^^^^^^^\nAttributeError: module 'solution' has no attribute 'solve'\n"
}
Output
challenge-coding-026
Suite: coding
Finish: stop
Prompt
只输出 Python 代码,不要解释。实现 solve(nums: list[int], k: int) -> list[float],返回每个长度为 k 的滑动窗口中位数。k 为奇数时返回中间值;k 为偶数时返回两个中间值平均数。
Standard Answer / Scoring Expectation
Reference tests:
assert solution.solve([1,3,-1,-3,5,3,6,7], 3) == [1, -1, -1, 3, 5, 6]
assert solution.solve([1,2,3,4], 2) == [1.5, 2.5, 3.5]
Mistake Analysis
Failure type: code_assertion_failure
双堆思路方向正确,但懒删除实现没有维护两个堆的“有效元素数量”。窗口滑动时旧元素只记在 `to_remove`,堆的物理长度仍参与 `balance()`,导致堆大小和真实窗口分布不同步;后半段窗口的中位数被旧元素/错误堆顶影响,第一组期望 `[1,-1,-1,3,5,6]`,模型给出后几项偏小。
Scorer Details
{
"returncode": 1,
"stdout": "",
"stderr": "Traceback (most recent call last):\n File \"/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-v55hwyoa/test_solution.py\", line 3, in <module>\n assert solution.solve([1,3,-1,-3,5,3,6,7], 3) == [1, -1, -1, 3, 5, 6]\nAssertionError\n"
}
Output
```python
import heapq
from collections import Counter
def solve(nums: list[int], k: int) -> list[float]:
small = []
large = []
small_removed = Counter()
large_removed = Counter()
def prune(heap, removed):
while heap:
val = -heap[0] if heap is small else heap[0]
if removed[val] > 0:
removed[val] -= 1
if removed[val] == 0:
del removed[val]
heapq.heappop(heap)
else:
break
def balance():
prune(small, small_removed)
prune(large, large_removed)
if len(small) > len(large) + 1:
val = -heapq.heappop(small)
heapq.heappush(large, val)
elif len(small) < len(large):
val = heapq.heappop(large)
heapq.heappush(small, -val)
prune(small, small_removed)
prune(large, large_removed)
def add(num):
if not small or num <= -small[0]:
heapq.heappush(small, -num)
else:
heapq.heappush(large, num)
balance()
def remove(num):
prune(small, small_removed)
prune(large, large_removed)
if num <= -small[0]:
small_removed[num] += 1
if num == -small[0]:
prune(small, small_removed)
else:
large_removed[num] += 1
if large and num == large[0]:
prune(large, large_removed)
balance()
for i in range(k):
add(nums[i])
res = []
if k % 2 == 1:
res.append(-small[0])
else:
res.append((-small[0] + large[0]) / 2.0)
for i in range(k, len(nums)):
remove(nums[i - k])
add(nums[i])
if k % 2 == 1:
r
challenge-coding-027
Suite: coding
Finish: stop
Prompt
只输出 Python 代码,不要解释。实现 solve(versions: list[str]) -> list[str],按简化语义版本排序。版本为 major.minor.patch 或 major.minor.patch-label;major/minor/patch 按数字比较;同一数字版本下,带 label 的预发布版本低于正式版本;label 按字典序比较。
Standard Answer / Scoring Expectation
Reference tests:
assert solution.solve(['1.0.0','1.0.0-alpha','1.0.1','1.0.0-beta','0.9.9']) == ['0.9.9','1.0.0-alpha','1.0.0-beta','1.0.0','1.0.1']
assert solution.solve(['1.0.10','1.0.2']) == ['1.0.2','1.0.10']
Mistake Analysis
Failure type: code_assertion_failure
版本排序方向写反了。题目要求同一数字版本下预发布版低于正式版,但模型的 key 是 `(numeric, 0 if label is None else 1, label)`,升序排序会把正式版 `1.0.0` 放在 `1.0.0-alpha` 和 `1.0.0-beta` 前面。根因是正式版/预发布版的排序标志位取值反了;应让带 label 的版本排在正式版之前,并为正式版使用可比较的占位 label。
Scorer Details
{
"returncode": 1,
"stdout": "",
"stderr": "Traceback (most recent call last):\n File \"/var/folders/x_/4cht1kfj1_j31gdv5w01sgmw0000gn/T/dracobench-code-q2vd7jmj/test_solution.py\", line 3, in <module>\n assert solution.solve(['1.0.0','1.0.0-alpha','1.0.1','1.0.0-beta','0.9.9']) == ['0.9.9','1.0.0-alpha','1.0.0-beta','1.0.0','1.0.1']\nAssertionError\n"
}
Output
```python
def solve(versions: list[str]) -> list[str]:
def key(v: str):
if '-' in v:
num, label = v.split('-', 1)
return (*map(int, num.split('.')), 1, label)
return (*map(int, v.split('.')), 0, '')
return sorted(versions, key=key)
```
challenge-rag-013
Suite: rag_long_context
Finish: stop
Prompt
只根据资料回答。
资料:为了复现一次 benchmark,记录中包含 model、case_id、prompt_hash、parameters、scorer details、output、latency_ms 和 usage。记录不包含 chain of thought,也不包含训练数据。
问题:复现评测主要应该依赖哪些记录字段?
Standard Answer / Scoring Expectation
Required phrases: model、prompt_hash、parameters、scorer
Forbidden phrases: chain of thought、训练数据
Length guidance (diagnostic only): min=n/a, max=200
Mistake Analysis
Failure type: forbidden_content
模型输出包含题目明确禁止的内容:chain of thought、训练数据。
Scorer Details
{
"missing": [],
"missing_any": [],
"present_forbidden": [
"chain of thought",
"训练数据"
],
"char_count": 289,
"length_ok": false,
"length_scored": false
}
Output
根据给定资料,复现评测主要依赖的字段有:
1. model:确定使用的模型,保障模型一致性;
2. case_id:对应具体测试用例,保障测试场景一致;
3. prompt_hash:对应具体输入提示内容,保障输入一致;
4. parameters:模型推理参数,保障推理配置一致;
5. scorer details:评分规则细节,保障评分逻辑一致;
6. output:用于验证复现结果是否匹配;
7. latency_ms、usage:对应性能相关指标,保障性能维度的复现验证。
注:资料明确说明记录不包含chain of thought、训练数据,无需依赖这两类内容。