GPT-5.6 Sol × debug
10.0Careful reading + correctness reasoning over broken code
correctness 10.0quality 10.0documentation 10.016534ms
$ cat debug.prompt — what the model was asked
The following Python function is supposed to return the top-N most frequent words in a string, sorted by frequency descending and alphabetically for ties. It has exactly 3 bugs. Find each bug, explain what it does wrong, fix it, and show the corrected function.
```python
from collections import Counter
def top_words(text: str, n: int = 10) -> list[str]:
words = text.lower().split()
words = [w.strip('.,!?;:\'"') for w in words]
counts = Counter(words)
ranked = sorted(counts.items(), key=lambda x: (-x[1], x[0]))
return [word for word, count in ranked[:n] if count > 1]
```
Test cases that expose the bugs:
- `top_words('the cat sat on the mat the', 3)` should return `['the', 'cat', 'mat']`
(3 most frequent; cat/mat/sat tie at 1 occurrence — alphabetical breaks the tie)
- `top_words('a a b b c', 2)` should return `['a', 'b']`
- `top_words('hello world', 5)` should return `['hello', 'world']`
For each bug: (1) quote the buggy line, (2) explain what it does wrong, (3) show the fix.run 1 of 1
10.0correctness 10.0quality 10.0documentation 10.016534ms
# judge: The response identifies all three genuine defects, explains their effects clearly, applies minimal clean fixes, and provides a corrected function that passes every stated test case.
$ cat codex-cli/gpt-5.6-sol.debug.r1.response
1. Buggy line:
```python
words = [w.strip('.,!?;:\'"') for w in words]
```
It retains empty strings produced from punctuation-only tokens, causing `''` to be counted as a word.
Fix:
```python
words = [cleaned for w in words if (cleaned := w.strip('.,!?;:\'"'))]
```
2. Buggy line:
```python
return [word for word, count in ranked[:n] if count > 1]
```
The `count > 1` condition incorrectly removes words occurring once, even when they belong in the top N.
Fix:
```python
return [word for word, _ in ranked[:n]]
```
3. Buggy line:
```python
return [word for word, count in ranked[:n] if count > 1]
```
For a negative `n`, `ranked[:n]` returns all but the last items rather than no words. A non-positive top-N request should return an empty list.
Fix:
```python
if n <= 0:
return []
```
Corrected function:
```python
from collections import Counter
def top_words(text: str, n: int = 10) -> list[str]:
if n <= 0:
return []
words = text.lower().split()
words = [
cleaned
for word in words
if (cleaned := word.strip('.,!?;:\'"'))
]
counts = Counter(words)
ranked = sorted(counts.items(), key=lambda item: (-item[1], item[0]))
return [word for word, _ in ranked[:n]]
```