AgentDebugger-training-v3 / data /generate_bugs.py
shank
chore: normalize dataset inputs and fix mergekit dependency for TRL 0.14.0
e67270e
"""
AgentDebuggerEnv - Bug Dataset Generator
Generates three tiers of buggy Python functions for curriculum learning:
Tier 1 (easy): Off-by-one errors, wrong operators, simple logic inversions
Tier 2 (medium): Incorrect algorithm logic, wrong variable references, subtle type errors
Tier 3 (hard): Multi-bug interactions, concurrency, edge-case-only failures
Usage:
python data/generate_bugs.py
Outputs:
data/bugs_tier1.jsonl (~40 bugs)
data/bugs_tier2.jsonl (~30 bugs)
data/bugs_tier3.jsonl (~20 bugs)
"""
import json
import os
TIER1_BUGS = [{'id': 't1_001',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'binary_search',
'buggy_code': 'def binary_search(arr, target):\n'
' left, right = 0, len(arr)\n'
' while left < right:\n'
' mid = (left + right) // 2\n'
' if arr[mid] == target:\n'
' return mid\n'
' elif arr[mid] < target:\n'
' left = mid + 1\n'
' else:\n'
' right = mid + 1 + 1 + 1\n'
' return -1',
'original_code': 'def binary_search(arr, target):\n'
' left, right = 0, len(arr) - 1\n'
' while left <= right:\n'
' mid = (left + right) // 2\n'
' if arr[mid] == target:\n'
' return mid\n'
' elif arr[mid] < target:\n'
' left = mid + 1\n'
' else:\n'
' right = mid - 1\n'
' return -1',
'initial_error': 'IndexError: list index out of range on line 5',
'bug_location': {'function': 'binary_search', 'line_start': 2},
'test_cases': [{'input': [[1, 3, 5, 7, 9], 5], 'expected_output': 2},
{'input': [[1, 3, 5, 7, 9], 1], 'expected_output': 0},
{'input': [[1, 3, 5, 7, 9], 9], 'expected_output': 4},
{'input': [[1, 3, 5, 7, 9], 4], 'expected_output': -1}]},
{'id': 't1_002',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'is_palindrome',
'buggy_code': 'def is_palindrome(s):\n return s == s[::-1] and len(s) > 0',
'original_code': 'def is_palindrome(s):\n return s == s[::-1]',
'initial_error': "AssertionError: is_palindrome('') expected True, got False",
'bug_location': {'function': 'is_palindrome', 'line_start': 2},
'test_cases': [{'input': ['racecar'], 'expected_output': True},
{'input': ['hello'], 'expected_output': False},
{'input': [''], 'expected_output': True},
{'input': ['a'], 'expected_output': True}]},
{'id': 't1_003',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'find_max',
'buggy_code': 'def find_max(nums):\n'
' max_val = nums[0]\n'
' for i in range(1, len(nums) + 1):\n'
' if nums[i] > max_val:\n'
' max_val = nums[i]\n'
' return max_val',
'original_code': 'def find_max(nums):\n'
' max_val = nums[0]\n'
' for i in range(1, len(nums)):\n'
' if nums[i] > max_val:\n'
' max_val = nums[i]\n'
' return max_val',
'initial_error': 'IndexError: list index out of range on line 4',
'bug_location': {'function': 'find_max', 'line_start': 3},
'test_cases': [{'input': [[3, 1, 4, 1, 5, 9]], 'expected_output': 9},
{'input': [[1]], 'expected_output': 1},
{'input': [[-5, -1, -3]], 'expected_output': -1},
{'input': [[7, 7, 7]], 'expected_output': 7}]},
{'id': 't1_004',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'count_vowels',
'buggy_code': 'def count_vowels(s):\n'
' count = 0\n'
' for ch in s:\n'
" if ch in 'aeiou':\n"
' count += 1\n'
' return count',
'original_code': 'def count_vowels(s):\n'
' count = 0\n'
' for ch in s.lower():\n'
" if ch in 'aeiou':\n"
' count += 1\n'
' return count',
'initial_error': "AssertionError: count_vowels('Hello') expected 2, got 1",
'bug_location': {'function': 'count_vowels', 'line_start': 3},
'test_cases': [{'input': ['hello'], 'expected_output': 2},
{'input': ['Hello'], 'expected_output': 2},
{'input': ['AEIOU'], 'expected_output': 5},
{'input': ['xyz'], 'expected_output': 0}]},
{'id': 't1_005',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'sum_list',
'buggy_code': 'def sum_list(nums):\n'
' total = 0\n'
' for i in range(len(nums) - 1):\n'
' total += nums[i]\n'
' return total',
'original_code': 'def sum_list(nums):\n'
' total = 0\n'
' for i in range(len(nums)):\n'
' total += nums[i]\n'
' return total',
'initial_error': 'AssertionError: sum_list([1,2,3]) expected 6, got 3',
'bug_location': {'function': 'sum_list', 'line_start': 3},
'test_cases': [{'input': [[1, 2, 3]], 'expected_output': 6},
{'input': [[0]], 'expected_output': 0},
{'input': [[10, 20, 30, 40]], 'expected_output': 100},
{'input': [[]], 'expected_output': 0}]},
{'id': 't1_006',
'difficulty': 1,
'bug_type': 'wrong_comparison',
'function_name': 'is_sorted',
'buggy_code': 'def is_sorted(lst):\n'
' for i in range(len(lst) - 1):\n'
' if lst[i] > lst[i + 1]:\n'
' return True\n'
' return False',
'original_code': 'def is_sorted(lst):\n'
' for i in range(len(lst) - 1):\n'
' if lst[i] > lst[i + 1]:\n'
' return False\n'
' return True',
'initial_error': 'AssertionError: is_sorted([1,2,3]) expected True, got False',
'bug_location': {'function': 'is_sorted', 'line_start': 4},
'test_cases': [{'input': [[1, 2, 3]], 'expected_output': True},
{'input': [[3, 1, 2]], 'expected_output': False},
{'input': [[1]], 'expected_output': True},
{'input': [[2, 2, 2]], 'expected_output': True}]},
{'id': 't1_007',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'factorial',
'buggy_code': 'def factorial(n):\n'
' if n == 0:\n'
' return 0\n'
' result = 1\n'
' for i in range(1, n + 1):\n'
' result *= i\n'
' return result',
'original_code': 'def factorial(n):\n'
' if n == 0:\n'
' return 1\n'
' result = 1\n'
' for i in range(1, n + 1):\n'
' result *= i\n'
' return result',
'initial_error': 'AssertionError: factorial(0) expected 1, got 0',
'bug_location': {'function': 'factorial', 'line_start': 3},
'test_cases': [{'input': [0], 'expected_output': 1},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 120},
{'input': [3], 'expected_output': 6}]},
{'id': 't1_008',
'difficulty': 1,
'bug_type': 'logic_inversion',
'function_name': 'is_even',
'buggy_code': 'def is_even(n):\n return n % 2 != 0',
'original_code': 'def is_even(n):\n return n % 2 == 0',
'initial_error': 'AssertionError: is_even(4) expected True, got False',
'bug_location': {'function': 'is_even', 'line_start': 2},
'test_cases': [{'input': [4], 'expected_output': True},
{'input': [3], 'expected_output': False},
{'input': [0], 'expected_output': True},
{'input': [-2], 'expected_output': True}]},
{'id': 't1_009',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'factorial',
'buggy_code': 'def factorial(n):\n if n == 0:\n return 1\n return n * factorial(n)',
'original_code': 'def factorial(n):\n if n == 0:\n return 1\n return n * factorial(n - 1)',
'initial_error': 'RecursionError: maximum recursion depth exceeded',
'bug_location': {'function': 'factorial', 'line_start': 4},
'test_cases': [{'input': [0], 'expected_output': 1},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 120},
{'input': [3], 'expected_output': 6}]},
{'id': 't1_010',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'factorial',
'buggy_code': 'def factorial(n):\n if n == 0:\n return 1\n return n + factorial(n - 1)',
'original_code': 'def factorial(n):\n if n == 0:\n return 1\n return n * factorial(n - 1)',
'initial_error': 'AssertionError: factorial(3) expected 6, got 6 - wait got 7',
'bug_location': {'function': 'factorial', 'line_start': 4},
'test_cases': [{'input': [0], 'expected_output': 1},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 120},
{'input': [3], 'expected_output': 6}]},
{'id': 't1_011',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'fibonacci',
'buggy_code': 'def fibonacci(n):\n if n < 1:\n return n\n return fibonacci(n-1) + fibonacci(n-2)',
'original_code': 'def fibonacci(n):\n if n <= 1:\n return n\n return fibonacci(n-1) + fibonacci(n-2)',
'initial_error': 'RecursionError: maximum recursion depth exceeded',
'bug_location': {'function': 'fibonacci', 'line_start': 2},
'test_cases': [{'input': [0], 'expected_output': 0},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 5},
{'input': [7], 'expected_output': 13}]},
{'id': 't1_012',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'fibonacci',
'buggy_code': 'def fibonacci(n):\n if n <= 1:\n return n\n return fibonacci(n-1) * fibonacci(n-2)',
'original_code': 'def fibonacci(n):\n if n <= 1:\n return n\n return fibonacci(n-1) + fibonacci(n-2)',
'initial_error': 'AssertionError: fibonacci(5) expected 5, got 0',
'bug_location': {'function': 'fibonacci', 'line_start': 4},
'test_cases': [{'input': [0], 'expected_output': 0},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 5},
{'input': [7], 'expected_output': 13}]},
{'id': 't1_013',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'string_reverse',
'buggy_code': 'def string_reverse(s):\n return s[:-1]',
'original_code': 'def string_reverse(s):\n return s[::-1]',
'initial_error': "AssertionError: string_reverse('hello') expected 'olleh', got 'hell'",
'bug_location': {'function': 'string_reverse', 'line_start': 2},
'test_cases': [{'input': ['hello'], 'expected_output': 'olleh'},
{'input': [''], 'expected_output': ''},
{'input': ['a'], 'expected_output': 'a'},
{'input': ['racecar'], 'expected_output': 'racecar'}]},
{'id': 't1_014',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'string_reverse',
'buggy_code': 'def string_reverse(s):\n return s[1:]',
'original_code': 'def string_reverse(s):\n return s[::-1]',
'initial_error': "AssertionError: string_reverse('hello') expected 'olleh', got 'ello'",
'bug_location': {'function': 'string_reverse', 'line_start': 2},
'test_cases': [{'input': ['hello'], 'expected_output': 'olleh'},
{'input': [''], 'expected_output': ''},
{'input': ['a'], 'expected_output': 'a'},
{'input': ['racecar'], 'expected_output': 'racecar'}]},
{'id': 't1_015',
'difficulty': 1,
'bug_type': 'wrong_comparison',
'function_name': 'count_occurrences',
'buggy_code': 'def count_occurrences(lst, target):\n'
' count = 0\n'
' for item in lst:\n'
' if item != target:\n'
' count += 1\n'
' return count',
'original_code': 'def count_occurrences(lst, target):\n'
' count = 0\n'
' for item in lst:\n'
' if item == target:\n'
' count += 1\n'
' return count',
'initial_error': 'AssertionError: count_occurrences([1,2,1,3,1], 1) expected 3, got 2',
'bug_location': {'function': 'count_occurrences', 'line_start': 4},
'test_cases': [{'input': [[1, 2, 1, 3, 1], 1], 'expected_output': 3},
{'input': [[], 5], 'expected_output': 0},
{'input': [[2, 2, 2], 2], 'expected_output': 3},
{'input': [[1, 2, 3], 4], 'expected_output': 0}]},
{'id': 't1_016',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'count_occurrences',
'buggy_code': 'def count_occurrences(lst, target):\n'
' count = 1\n'
' for item in lst:\n'
' if item == target:\n'
' count += 1\n'
' return count',
'original_code': 'def count_occurrences(lst, target):\n'
' count = 0\n'
' for item in lst:\n'
' if item == target:\n'
' count += 1\n'
' return count',
'initial_error': 'AssertionError: count_occurrences([], 5) expected 0, got 1',
'bug_location': {'function': 'count_occurrences', 'line_start': 2},
'test_cases': [{'input': [[1, 2, 1, 3, 1], 1], 'expected_output': 3},
{'input': [[], 5], 'expected_output': 0},
{'input': [[2, 2, 2], 2], 'expected_output': 3},
{'input': [[1, 2, 3], 4], 'expected_output': 0}]},
{'id': 't1_017',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'sum_digits',
'buggy_code': 'def sum_digits(n):\n'
' total = 0\n'
' while n > 0:\n'
' total += n // 10\n'
' n //= 10\n'
' return total',
'original_code': 'def sum_digits(n):\n'
' total = 0\n'
' while n > 0:\n'
' total += n % 10\n'
' n //= 10\n'
' return total',
'initial_error': 'AssertionError: sum_digits(123) expected 6, got 13',
'bug_location': {'function': 'sum_digits', 'line_start': 4},
'test_cases': [{'input': [123], 'expected_output': 6},
{'input': [0], 'expected_output': 0},
{'input': [999], 'expected_output': 27},
{'input': [10], 'expected_output': 1}]},
{'id': 't1_018',
'difficulty': 1,
'bug_type': 'logic_inversion',
'function_name': 'sum_digits',
'buggy_code': 'def sum_digits(n):\n'
' total = 0\n'
' while n < 0:\n'
' total += n % 10\n'
' n //= 10\n'
' return total',
'original_code': 'def sum_digits(n):\n'
' total = 0\n'
' while n > 0:\n'
' total += n % 10\n'
' n //= 10\n'
' return total',
'initial_error': 'AssertionError: sum_digits(123) expected 6, got 0',
'bug_location': {'function': 'sum_digits', 'line_start': 3},
'test_cases': [{'input': [123], 'expected_output': 6},
{'input': [0], 'expected_output': 0},
{'input': [999], 'expected_output': 27},
{'input': [10], 'expected_output': 1}]},
{'id': 't1_019',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'is_prime',
'buggy_code': 'def is_prime(n):\n'
' if n < 1:\n'
' return False\n'
' for i in range(2, int(n**0.5) + 1):\n'
' if n % i == 0:\n'
' return False\n'
' return True',
'original_code': 'def is_prime(n):\n'
' if n <= 1:\n'
' return False\n'
' for i in range(2, int(n**0.5) + 1):\n'
' if n % i == 0:\n'
' return False\n'
' return True',
'initial_error': 'AssertionError: is_prime(1) expected False, got True',
'bug_location': {'function': 'is_prime', 'line_start': 2},
'test_cases': [{'input': [2], 'expected_output': True},
{'input': [4], 'expected_output': False},
{'input': [13], 'expected_output': True},
{'input': [1], 'expected_output': False}]},
{'id': 't1_020',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'is_prime',
'buggy_code': 'def is_prime(n):\n'
' if n <= 1:\n'
' return False\n'
' for i in range(2, int(n**0.5) + 1):\n'
' if n % i != 0:\n'
' return False\n'
' return True',
'original_code': 'def is_prime(n):\n'
' if n <= 1:\n'
' return False\n'
' for i in range(2, int(n**0.5) + 1):\n'
' if n % i == 0:\n'
' return False\n'
' return True',
'initial_error': 'AssertionError: is_prime(13) expected True, got False',
'bug_location': {'function': 'is_prime', 'line_start': 5},
'test_cases': [{'input': [2], 'expected_output': True},
{'input': [4], 'expected_output': False},
{'input': [13], 'expected_output': True},
{'input': [1], 'expected_output': False}]},
{'id': 't1_021',
'difficulty': 1,
'bug_type': 'wrong_comparison',
'function_name': 'merge_intervals',
'buggy_code': 'def merge_intervals(intervals):\n'
' if not intervals:\n'
' return []\n'
' intervals.sort(key=lambda x: x[0])\n'
' merged = [intervals[0]]\n'
' for current in intervals:\n'
' previous = merged[-1]\n'
' if current[0] < previous[1]:\n'
' previous[1] = max(previous[1], current[1])\n'
' else:\n'
' merged.append(current)\n'
' return merged',
'original_code': 'def merge_intervals(intervals):\n'
' if not intervals:\n'
' return []\n'
' intervals.sort(key=lambda x: x[0])\n'
' merged = [intervals[0]]\n'
' for current in intervals:\n'
' previous = merged[-1]\n'
' if current[0] <= previous[1]:\n'
' previous[1] = max(previous[1], current[1])\n'
' else:\n'
' merged.append(current)\n'
' return merged',
'initial_error': 'AssertionError: merge_intervals([[1,4],[4,5]]) expected [[1,5]], got [[1,4],[4,5]]',
'bug_location': {'function': 'merge_intervals', 'line_start': 8},
'test_cases': [{'input': [[[1, 3], [2, 6], [8, 10], [15, 18]]], 'expected_output': [[1, 6], [8, 10], [15, 18]]},
{'input': [[[1, 4], [4, 5]]], 'expected_output': [[1, 5]]},
{'input': [[]], 'expected_output': []},
{'input': [[[1, 4], [0, 4]]], 'expected_output': [[0, 4]]}]},
{'id': 't1_022',
'difficulty': 1,
'bug_type': 'logic_inversion',
'function_name': 'merge_intervals',
'buggy_code': 'def merge_intervals(intervals):\n'
' if intervals:\n'
' return []\n'
' intervals.sort(key=lambda x: x[0])\n'
' merged = [intervals[0]]\n'
' for current in intervals:\n'
' previous = merged[-1]\n'
' if current[0] <= previous[1]:\n'
' previous[1] = max(previous[1], current[1])\n'
' else:\n'
' merged.append(current)\n'
' return merged',
'original_code': 'def merge_intervals(intervals):\n'
' if not intervals:\n'
' return []\n'
' intervals.sort(key=lambda x: x[0])\n'
' merged = [intervals[0]]\n'
' for current in intervals:\n'
' previous = merged[-1]\n'
' if current[0] <= previous[1]:\n'
' previous[1] = max(previous[1], current[1])\n'
' else:\n'
' merged.append(current)\n'
' return merged',
'initial_error': 'AssertionError: merge_intervals([[1,4],[4,5]]) expected [[1,5]], got []',
'bug_location': {'function': 'merge_intervals', 'line_start': 2},
'test_cases': [{'input': [[[1, 3], [2, 6], [8, 10], [15, 18]]], 'expected_output': [[1, 6], [8, 10], [15, 18]]},
{'input': [[[1, 4], [4, 5]]], 'expected_output': [[1, 5]]},
{'input': [[]], 'expected_output': []},
{'input': [[[1, 4], [0, 4]]], 'expected_output': [[0, 4]]}]},
{'id': 't1_023',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'remove_duplicates',
'buggy_code': 'def remove_duplicates(nums):\n'
' if not nums:\n'
' return 0\n'
' i = 0\n'
' for j in range(1, len(nums)):\n'
' if nums[j] == nums[i]:\n'
' i += 1\n'
' nums[i] = nums[j]\n'
' return i + 1',
'original_code': 'def remove_duplicates(nums):\n'
' if not nums:\n'
' return 0\n'
' i = 0\n'
' for j in range(1, len(nums)):\n'
' if nums[j] != nums[i]:\n'
' i += 1\n'
' nums[i] = nums[j]\n'
' return i + 1',
'initial_error': 'AssertionError: remove_duplicates([1,1,2]) expected 2, got 2 with array [1,1,2]',
'bug_location': {'function': 'remove_duplicates', 'line_start': 6},
'test_cases': [{'input': [[1, 1, 2]], 'expected_output': 2},
{'input': [[0, 0, 1, 1, 1, 2, 2, 3, 3, 4]], 'expected_output': 5},
{'input': [[]], 'expected_output': 0},
{'input': [[1]], 'expected_output': 1}]},
{'id': 't1_024',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'remove_duplicates',
'buggy_code': 'def remove_duplicates(nums):\n'
' if not nums:\n'
' return 0\n'
' i = 0\n'
' for j in range(1, len(nums)):\n'
' if nums[j] != nums[i]:\n'
' i += 1\n'
' nums[i] = nums[j]\n'
' return i',
'original_code': 'def remove_duplicates(nums):\n'
' if not nums:\n'
' return 0\n'
' i = 0\n'
' for j in range(1, len(nums)):\n'
' if nums[j] != nums[i]:\n'
' i += 1\n'
' nums[i] = nums[j]\n'
' return i + 1',
'initial_error': 'AssertionError: remove_duplicates([1,1,2]) expected 2, got 1',
'bug_location': {'function': 'remove_duplicates', 'line_start': 9},
'test_cases': [{'input': [[1, 1, 2]], 'expected_output': 2},
{'input': [[0, 0, 1, 1, 1, 2, 2, 3, 3, 4]], 'expected_output': 5},
{'input': [[]], 'expected_output': 0},
{'input': [[1]], 'expected_output': 1}]},
{'id': 't1_025',
'difficulty': 1,
'bug_type': 'wrong_comparison',
'function_name': 'longest_common_prefix',
'buggy_code': 'def longest_common_prefix(strs):\n'
' if not strs:\n'
' return ""\n'
' prefix = strs[0]\n'
' for s in strs[1:]:\n'
' while s.startswith(prefix):\n'
' prefix = prefix[:-1]\n'
' if not prefix:\n'
' return ""\n'
' return prefix',
'original_code': 'def longest_common_prefix(strs):\n'
' if not strs:\n'
' return ""\n'
' prefix = strs[0]\n'
' for s in strs[1:]:\n'
' while not s.startswith(prefix):\n'
' prefix = prefix[:-1]\n'
' if not prefix:\n'
' return ""\n'
' return prefix',
'initial_error': "AssertionError: longest_common_prefix(['flower','flow','flight']) expected 'fl', got ''",
'bug_location': {'function': 'longest_common_prefix', 'line_start': 6},
'test_cases': [{'input': [['flower', 'flow', 'flight']], 'expected_output': 'fl'},
{'input': [['dog', 'racecar', 'car']], 'expected_output': ''},
{'input': [[]], 'expected_output': ''},
{'input': [['a']], 'expected_output': 'a'}]},
{'id': 't1_026',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'longest_common_prefix',
'buggy_code': 'def longest_common_prefix(strs):\n'
' if not strs:\n'
' return ""\n'
' prefix = strs[0]\n'
' for s in strs:\n'
' while not s.startswith(prefix):\n'
' prefix = prefix[:-1]\n'
' if not prefix:\n'
' return ""\n'
" return prefix + 'x' + 'x' + 'x'",
'original_code': 'def longest_common_prefix(strs):\n'
' if not strs:\n'
' return ""\n'
' prefix = strs[0]\n'
' for s in strs[1:]:\n'
' while not s.startswith(prefix):\n'
' prefix = prefix[:-1]\n'
' if not prefix:\n'
' return ""\n'
' return prefix',
'initial_error': "AssertionError: doesn't strictly fail but runs longer",
'bug_location': {'function': 'longest_common_prefix', 'line_start': 5},
'test_cases': [{'input': [['flower', 'flow', 'flight']], 'expected_output': 'fl'},
{'input': [['dog', 'racecar', 'car']], 'expected_output': ''},
{'input': [[]], 'expected_output': ''},
{'input': [['a']], 'expected_output': 'a'}]},
{'id': 't1_027',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'product_except_self',
'buggy_code': 'def product_except_self(nums):\n'
' n = len(nums)\n'
' res = [1] * n\n'
' prefix = 1\n'
' for i in range(n):\n'
' res[i] = prefix\n'
' prefix += nums[i]\n'
' postfix = 1\n'
' for i in range(n - 1, -1, -1):\n'
' res[i] *= postfix\n'
' postfix *= nums[i]\n'
' return res',
'original_code': 'def product_except_self(nums):\n'
' n = len(nums)\n'
' res = [1] * n\n'
' prefix = 1\n'
' for i in range(n):\n'
' res[i] = prefix\n'
' prefix *= nums[i]\n'
' postfix = 1\n'
' for i in range(n - 1, -1, -1):\n'
' res[i] *= postfix\n'
' postfix *= nums[i]\n'
' return res',
'initial_error': 'AssertionError: product_except_self([1,2,3,4]) expected [24,12,8,6], got [24, 24, 16, 6]',
'bug_location': {'function': 'product_except_self', 'line_start': 7},
'test_cases': [{'input': [[1, 2, 3, 4]], 'expected_output': [24, 12, 8, 6]},
{'input': [[-1, 1, 0, -3, 3]], 'expected_output': [0, 0, 9, 0, 0]},
{'input': [[2, 3]], 'expected_output': [3, 2]},
{'input': [[1, 1, 1]], 'expected_output': [1, 1, 1]}]},
{'id': 't1_028',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'product_except_self',
'buggy_code': 'def product_except_self(nums):\n'
' n = len(nums)\n'
' res = [1] * n\n'
' prefix = 1\n'
' for i in range(n):\n'
' res[i] = prefix\n'
' prefix *= nums[i]\n'
' postfix = 1\n'
' for i in range(n - 1, 0, -1):\n'
' res[i] *= postfix\n'
' postfix *= nums[i]\n'
' return res',
'original_code': 'def product_except_self(nums):\n'
' n = len(nums)\n'
' res = [1] * n\n'
' prefix = 1\n'
' for i in range(n):\n'
' res[i] = prefix\n'
' prefix *= nums[i]\n'
' postfix = 1\n'
' for i in range(n - 1, -1, -1):\n'
' res[i] *= postfix\n'
' postfix *= nums[i]\n'
' return res',
'initial_error': 'AssertionError: product_except_self([1,2,3,4]) expected [24,12,8,6], got [1,12,8,6]',
'bug_location': {'function': 'product_except_self', 'line_start': 9},
'test_cases': [{'input': [[1, 2, 3, 4]], 'expected_output': [24, 12, 8, 6]},
{'input': [[-1, 1, 0, -3, 3]], 'expected_output': [0, 0, 9, 0, 0]},
{'input': [[2, 3]], 'expected_output': [3, 2]},
{'input': [[1, 1, 1]], 'expected_output': [1, 1, 1]}]},
{'id': 't1_029',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'valid_parentheses',
'buggy_code': 'def valid_parentheses(s):\n'
' stack = []\n'
" mapping = {')': '(', '}': '{', ']': '['}\n"
' for char in s:\n'
' if char in mapping:\n'
" top_element = stack.pop() if stack else '#'\n"
' if mapping[char] == top_element:\n'
' return False\n'
' else:\n'
' stack.append(char)\n'
' return not stack',
'original_code': 'def valid_parentheses(s):\n'
' stack = []\n'
" mapping = {')': '(', '}': '{', ']': '['}\n"
' for char in s:\n'
' if char in mapping:\n'
" top_element = stack.pop() if stack else '#'\n"
' if mapping[char] != top_element:\n'
' return False\n'
' else:\n'
' stack.append(char)\n'
' return not stack',
'initial_error': "AssertionError: valid_parentheses('()') expected True, got False",
'bug_location': {'function': 'valid_parentheses', 'line_start': 7},
'test_cases': [{'input': ['()'], 'expected_output': True},
{'input': ['()[]{}'], 'expected_output': True},
{'input': ['(]'], 'expected_output': False},
{'input': ['([)]'], 'expected_output': False}]},
{'id': 't1_030',
'difficulty': 1,
'bug_type': 'logic_inversion',
'function_name': 'valid_parentheses',
'buggy_code': 'def valid_parentheses(s):\n'
' stack = []\n'
" mapping = {')': '(', '}': '{', ']': '['}\n"
' for char in s:\n'
' if char in mapping:\n'
" top_element = stack.pop() if stack else '#'\n"
' if mapping[char] != top_element:\n'
' return False\n'
' else:\n'
' stack.append(char)\n'
' return bool(stack)',
'original_code': 'def valid_parentheses(s):\n'
' stack = []\n'
" mapping = {')': '(', '}': '{', ']': '['}\n"
' for char in s:\n'
' if char in mapping:\n'
" top_element = stack.pop() if stack else '#'\n"
' if mapping[char] != top_element:\n'
' return False\n'
' else:\n'
' stack.append(char)\n'
' return not stack',
'initial_error': "AssertionError: valid_parentheses('()') expected True, got False",
'bug_location': {'function': 'valid_parentheses', 'line_start': 11},
'test_cases': [{'input': ['()'], 'expected_output': True},
{'input': ['()[]{}'], 'expected_output': True},
{'input': ['(]'], 'expected_output': False},
{'input': ['([)]'], 'expected_output': False}]},
{'id': 't1_031',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'climbing_stairs',
'buggy_code': 'def climbing_stairs(n):\n'
' if n <= 2:\n'
' return n\n'
' a, b = 1, 2\n'
' for _ in range(3, n):\n'
' a, b = b, a + b\n'
' return b',
'original_code': 'def climbing_stairs(n):\n'
' if n <= 2:\n'
' return n\n'
' a, b = 1, 2\n'
' for _ in range(3, n + 1):\n'
' a, b = b, a + b\n'
' return b',
'initial_error': 'AssertionError: climbing_stairs(3) expected 3, got 2',
'bug_location': {'function': 'climbing_stairs', 'line_start': 5},
'test_cases': [{'input': [2], 'expected_output': 2},
{'input': [3], 'expected_output': 3},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 8}]},
{'id': 't1_032',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'climbing_stairs',
'buggy_code': 'def climbing_stairs(n):\n'
' if n <= 2:\n'
' return n\n'
' a, b = 1, 2\n'
' for _ in range(3, n + 1):\n'
' a, b = b, a * b\n'
' return b',
'original_code': 'def climbing_stairs(n):\n'
' if n <= 2:\n'
' return n\n'
' a, b = 1, 2\n'
' for _ in range(3, n + 1):\n'
' a, b = b, a + b\n'
' return b',
'initial_error': 'AssertionError: climbing_stairs(3) expected 3, got 2',
'bug_location': {'function': 'climbing_stairs', 'line_start': 6},
'test_cases': [{'input': [2], 'expected_output': 2},
{'input': [3], 'expected_output': 3},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 8}]},
{'id': 't1_033',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'house_robber',
'buggy_code': 'def house_robber(nums):\n'
' if not nums:\n'
' return 0\n'
' if len(nums) == 1:\n'
' return nums[0]\n'
' dp = [0] * len(nums)\n'
' dp[0] = nums[0]\n'
' dp[1] = 9999\n'
' for i in range(2, len(nums)):\n'
' dp[i] = max(dp[i-1], dp[i-2] + nums[i])\n'
' return dp[-1]',
'original_code': 'def house_robber(nums):\n'
' if not nums:\n'
' return 0\n'
' if len(nums) == 1:\n'
' return nums[0]\n'
' dp = [0] * len(nums)\n'
' dp[0] = nums[0]\n'
' dp[1] = max(nums[0], nums[1])\n'
' for i in range(2, len(nums)):\n'
' dp[i] = max(dp[i-1], dp[i-2] + nums[i])\n'
' return dp[-1]',
'initial_error': 'AssertionError: house_robber([2,7,9,3,1]) expected 12, got 11',
'bug_location': {'function': 'house_robber', 'line_start': 8},
'test_cases': [{'input': [[1, 2, 3, 1]], 'expected_output': 4},
{'input': [[2, 7, 9, 3, 1]], 'expected_output': 12},
{'input': [[]], 'expected_output': 0},
{'input': [[5]], 'expected_output': 5}]},
{'id': 't1_034',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'house_robber',
'buggy_code': 'def house_robber(nums):\n'
' if not nums:\n'
' return 0\n'
' if len(nums) == 1:\n'
' return nums[0]\n'
' dp = [0] * len(nums)\n'
' dp[0] = nums[0]\n'
' dp[1] = max(nums[0], nums[1])\n'
' for i in range(1, len(nums)):\n'
' dp[i] = max(dp[i-1], nums[i])\n'
' return dp[-1]',
'original_code': 'def house_robber(nums):\n'
' if not nums:\n'
' return 0\n'
' if len(nums) == 1:\n'
' return nums[0]\n'
' dp = [0] * len(nums)\n'
' dp[0] = nums[0]\n'
' dp[1] = max(nums[0], nums[1])\n'
' for i in range(2, len(nums)):\n'
' dp[i] = max(dp[i-1], dp[i-2] + nums[i])\n'
' return dp[-1]',
'initial_error': 'IndexError: list index out of range',
'bug_location': {'function': 'house_robber', 'line_start': 9},
'test_cases': [{'input': [[1, 2, 3, 1]], 'expected_output': 4},
{'input': [[2, 7, 9, 3, 1]], 'expected_output': 12},
{'input': [[]], 'expected_output': 0},
{'input': [[5]], 'expected_output': 5}]},
{'id': 't1_035',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'intersection_of_arrays',
'buggy_code': 'def intersection_of_arrays(nums1, nums2):\n return list(set(nums1) | set(nums2))',
'original_code': 'def intersection_of_arrays(nums1, nums2):\n return list(set(nums1) & set(nums2))',
'initial_error': 'AssertionError: intersection_of_arrays([1,2,2,1], [2,2]) expected [2], got [1,2]',
'bug_location': {'function': 'intersection_of_arrays', 'line_start': 2},
'test_cases': [{'input': [[1, 2, 2, 1], [2, 2]], 'expected_output': [2]},
{'input': [[4, 9, 5], [9, 4, 9, 8, 4]], 'expected_output': [9, 4]},
{'input': [[], [1]], 'expected_output': []},
{'input': [[1, 2], [3, 4]], 'expected_output': []}]},
{'id': 't1_036',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'intersection_of_arrays',
'buggy_code': 'def intersection_of_arrays(nums1, nums2):\n return list(set(nums1) - set(nums2))',
'original_code': 'def intersection_of_arrays(nums1, nums2):\n return list(set(nums1) & set(nums2))',
'initial_error': 'AssertionError: intersection_of_arrays([1,2,2,1], [2,2]) expected [2], got [1]',
'bug_location': {'function': 'intersection_of_arrays', 'line_start': 2},
'test_cases': [{'input': [[1, 2, 2, 1], [2, 2]], 'expected_output': [2]},
{'input': [[4, 9, 5], [9, 4, 9, 8, 4]], 'expected_output': [9, 4]},
{'input': [[], [1]], 'expected_output': []},
{'input': [[1, 2], [3, 4]], 'expected_output': []}]},
{'id': 't1_037',
'difficulty': 1,
'bug_type': 'wrong_comparison',
'function_name': 'group_anagrams',
'buggy_code': 'def group_anagrams(strs):\n'
' from collections import defaultdict\n'
' ans = defaultdict(list)\n'
' for s in strs:\n'
' ans[tuple(s)].append(s)\n'
' return list(ans.values())',
'original_code': 'def group_anagrams(strs):\n'
' from collections import defaultdict\n'
' ans = defaultdict(list)\n'
' for s in strs:\n'
' ans[tuple(sorted(s))].append(s)\n'
' return list(ans.values())',
'initial_error': "AssertionError: expected [['eat','tea','ate'],['tan','nat'],['bat']]",
'bug_location': {'function': 'group_anagrams', 'line_start': 5},
'test_cases': [{'input': [['eat', 'tea', 'tan', 'ate', 'nat', 'bat']],
'expected_output': [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]},
{'input': [['']], 'expected_output': [['']]},
{'input': [['a']], 'expected_output': [['a']]},
{'input': [['ab', 'ba']], 'expected_output': [['ab', 'ba']]}]},
{'id': 't1_038',
'difficulty': 1,
'bug_type': 'logic_inversion',
'function_name': 'group_anagrams',
'buggy_code': 'def group_anagrams(strs):\n'
' from collections import defaultdict\n'
' ans = defaultdict(list)\n'
' for s in strs:\n'
' ans[tuple(sorted(s))].append(s[::-1])\n'
' return list(ans.values())',
'original_code': 'def group_anagrams(strs):\n'
' from collections import defaultdict\n'
' ans = defaultdict(list)\n'
' for s in strs:\n'
' ans[tuple(sorted(s))].append(s)\n'
' return list(ans.values())',
'initial_error': "AssertionError: expected [['eat','tea','ate'],['tan','nat'],['bat']]",
'bug_location': {'function': 'group_anagrams', 'line_start': 5},
'test_cases': [{'input': [['eat', 'tea', 'tan', 'ate', 'nat', 'bat']],
'expected_output': [['eat', 'tea', 'ate'], ['tan', 'nat'], ['bat']]},
{'input': [['']], 'expected_output': [['']]},
{'input': [['a']], 'expected_output': [['a']]},
{'input': [['ab', 'ba']], 'expected_output': [['ab', 'ba']]}]},
{'id': 't1_039',
'difficulty': 1,
'bug_type': 'wrong_operator',
'function_name': 'sum_digits',
'buggy_code': 'def sum_digits(n):\n'
' total = 0\n'
' while n > 0:\n'
' total *= n % 10\n'
' n //= 10\n'
' return total',
'original_code': 'def sum_digits(n):\n'
' total = 0\n'
' while n > 0:\n'
' total += n % 10\n'
' n //= 10\n'
' return total',
'initial_error': 'AssertionError: sum_digits(123) expected 6, got 0',
'bug_location': {'function': 'sum_digits', 'line_start': 4},
'test_cases': [{'input': [123], 'expected_output': 6},
{'input': [0], 'expected_output': 0},
{'input': [999], 'expected_output': 27},
{'input': [10], 'expected_output': 1}]},
{'id': 't1_040',
'difficulty': 1,
'bug_type': 'off_by_one',
'function_name': 'factorial',
'buggy_code': 'def factorial(n):\n if n <= 0:\n return 0\n return n * factorial(n - 1)',
'original_code': 'def factorial(n):\n if n == 0:\n return 1\n return n * factorial(n - 1)',
'initial_error': 'AssertionError: factorial(3) expected 6, got 0',
'bug_location': {'function': 'factorial', 'line_start': 3},
'test_cases': [{'input': [0], 'expected_output': 1},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 120},
{'input': [3], 'expected_output': 6}]}]
TIER2_BUGS = [{'id': 't2_001',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'two_sum',
'buggy_code': 'def two_sum(nums, target):\n'
' seen = {}\n'
' for i, num in enumerate(nums):\n'
' complement = target - num\n'
' if complement in seen:\n'
' return [seen[complement], i]\n'
' seen[num] = num\n'
' return []',
'original_code': 'def two_sum(nums, target):\n'
' seen = {}\n'
' for i, num in enumerate(nums):\n'
' complement = target - num\n'
' if complement in seen:\n'
' return [seen[complement], i]\n'
' seen[num] = i\n'
' return []',
'initial_error': 'AssertionError: two_sum([2,7,11,15], 9) expected [0,1], got [2,1]',
'bug_location': {'function': 'two_sum', 'line_start': 7},
'test_cases': [{'input': [[2, 7, 11, 15], 9], 'expected_output': [0, 1]},
{'input': [[3, 2, 4], 6], 'expected_output': [1, 2]},
{'input': [[3, 3], 6], 'expected_output': [0, 1]}]},
{'id': 't2_002',
'difficulty': 2,
'bug_type': 'missing_base_case',
'function_name': 'fibonacci',
'buggy_code': 'def fibonacci(n):\n if n == 0:\n return 0\n return fibonacci(n - 1) + fibonacci(n - 2)',
'original_code': 'def fibonacci(n):\n'
' if n == 0:\n'
' return 0\n'
' if n == 1:\n'
' return 1\n'
' return fibonacci(n - 1) + fibonacci(n - 2)',
'initial_error': 'RecursionError: maximum recursion depth exceeded',
'bug_location': {'function': 'fibonacci', 'line_start': 4},
'test_cases': [{'input': [0], 'expected_output': 0},
{'input': [1], 'expected_output': 1},
{'input': [5], 'expected_output': 5},
{'input': [7], 'expected_output': 13}]},
{'id': 't2_003',
'difficulty': 2,
'bug_type': 'wrong_accumulator',
'function_name': 'flatten',
'buggy_code': 'def flatten(lst):\n'
' result = []\n'
' for item in lst:\n'
' if isinstance(item, list):\n'
' result.append(flatten(item))\n'
' else:\n'
' result.append(item)\n'
' return result',
'original_code': 'def flatten(lst):\n'
' result = []\n'
' for item in lst:\n'
' if isinstance(item, list):\n'
' result.extend(flatten(item))\n'
' else:\n'
' result.append(item)\n'
' return result',
'initial_error': 'AssertionError: flatten([[1,[2]],3]) expected [1,2,3], got [1,[2],3]',
'bug_location': {'function': 'flatten', 'line_start': 5},
'test_cases': [{'input': [[[1, [2]], 3]], 'expected_output': [1, 2, 3]},
{'input': [[1, 2, 3]], 'expected_output': [1, 2, 3]},
{'input': [[[1, 2], [3, [4, 5]]]], 'expected_output': [1, 2, 3, 4, 5]}]},
{'id': 't2_004',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'find_first_positive',
'buggy_code': 'def find_first_positive(nums):\n'
' i = 0\n'
' while i < len(nums) - 1:\n'
' if nums[i] > 0:\n'
' return nums[i]\n'
' i += 1\n'
' return -1',
'original_code': 'def find_first_positive(nums):\n'
' i = 0\n'
' while i < len(nums):\n'
' if nums[i] > 0:\n'
' return nums[i]\n'
' i += 1\n'
' return -1',
'initial_error': 'AssertionError: expected 5, got -1',
'bug_location': {'function': 'find_first_positive', 'line_start': 3},
'test_cases': [{'input': [[-1, -2, 5]], 'expected_output': 5},
{'input': [[1, 2, 3]], 'expected_output': 1},
{'input': [[-1]], 'expected_output': -1},
{'input': [[-5, -3, -1, 10]], 'expected_output': 10}]},
{'id': 't2_005',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'binary_search_insert',
'buggy_code': 'def binary_search_insert(arr, target):\n'
' left, right = 0, len(arr) - 1\n'
' while left < right:\n'
' mid = (left + right) // 2\n'
' if arr[mid] < target:\n'
' left = mid + 1\n'
' else:\n'
' right = mid\n'
' return left',
'original_code': 'def binary_search_insert(arr, target):\n'
' left, right = 0, len(arr)\n'
' while left < right:\n'
' mid = (left + right) // 2\n'
' if arr[mid] < target:\n'
' left = mid + 1\n'
' else:\n'
' right = mid\n'
' return left',
'initial_error': 'AssertionError: expected 3, got 2',
'bug_location': {'function': 'binary_search_insert', 'line_start': 2},
'test_cases': [{'input': [[1, 3, 5], 6], 'expected_output': 3},
{'input': [[1, 3, 5], 4], 'expected_output': 2},
{'input': [[1, 3, 5], 0], 'expected_output': 0},
{'input': [[], 1], 'expected_output': 0}]},
{'id': 't2_006',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'countdown_to_zero',
'buggy_code': 'def countdown_to_zero(n):\n'
' res = []\n'
' while n > 0:\n'
' res.append(n)\n'
' n -= 1\n'
' return res',
'original_code': 'def countdown_to_zero(n):\n'
' res = []\n'
' while n >= 0:\n'
' res.append(n)\n'
' n -= 1\n'
' return res',
'initial_error': 'AssertionError: expected [3, 2, 1, 0], got [3, 2, 1]',
'bug_location': {'function': 'countdown_to_zero', 'line_start': 3},
'test_cases': [{'input': [3], 'expected_output': [3, 2, 1, 0]},
{'input': [0], 'expected_output': [0]},
{'input': [1], 'expected_output': [1, 0]},
{'input': [-1], 'expected_output': []}]},
{'id': 't2_007',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'collect_until_negative',
'buggy_code': 'def collect_until_negative(nums):\n'
' res = []\n'
' i = 0\n'
' while i <= len(nums) and nums[i] >= 0:\n'
' res.append(nums[i])\n'
' i += 1\n'
' return res',
'original_code': 'def collect_until_negative(nums):\n'
' res = []\n'
' i = 0\n'
' while i < len(nums) and nums[i] >= 0:\n'
' res.append(nums[i])\n'
' i += 1\n'
' return res',
'initial_error': 'IndexError: list index out of range',
'bug_location': {'function': 'collect_until_negative', 'line_start': 4},
'test_cases': [{'input': [[1, 2, -1, 3]], 'expected_output': [1, 2]},
{'input': [[1, 2, 3]], 'expected_output': [1, 2, 3]},
{'input': [[-1]], 'expected_output': []},
{'input': [[]], 'expected_output': []}]},
{'id': 't2_008',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'skip_spaces',
'buggy_code': "def skip_spaces(s):\n i = 0\n while s[i] == ' ':\n i += 1\n return s[i:]",
'original_code': 'def skip_spaces(s):\n'
' i = 0\n'
" while i < len(s) and s[i] == ' ':\n"
' i += 1\n'
' return s[i:]',
'initial_error': 'IndexError: string index out of range',
'bug_location': {'function': 'skip_spaces', 'line_start': 3},
'test_cases': [{'input': [' hello'], 'expected_output': 'hello'},
{'input': [' '], 'expected_output': ''},
{'input': ['world'], 'expected_output': 'world'},
{'input': [''], 'expected_output': ''}]},
{'id': 't2_009',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'find_last_even',
'buggy_code': 'def find_last_even(nums):\n'
' i = len(nums) - 1\n'
' while i > 0:\n'
' if nums[i] % 2 == 0:\n'
' return nums[i]\n'
' i -= 1\n'
' return -1',
'original_code': 'def find_last_even(nums):\n'
' i = len(nums) - 1\n'
' while i >= 0:\n'
' if nums[i] % 2 == 0:\n'
' return nums[i]\n'
' i -= 1\n'
' return -1',
'initial_error': 'AssertionError: expected 2, got -1',
'bug_location': {'function': 'find_last_even', 'line_start': 3},
'test_cases': [{'input': [[2, 3, 5]], 'expected_output': 2},
{'input': [[1, 3, 4]], 'expected_output': 4},
{'input': [[1, 3, 5]], 'expected_output': -1},
{'input': [[6]], 'expected_output': 6}]},
{'id': 't2_010',
'difficulty': 2,
'bug_type': 'wrong_loop_termination',
'function_name': 'get_chunks',
'buggy_code': 'def get_chunks(lst, size):\n'
' chunks = []\n'
' i = 0\n'
' while i < len(lst) - size:\n'
' chunks.append(lst[i:i+size])\n'
' i += size\n'
' return chunks',
'original_code': 'def get_chunks(lst, size):\n'
' chunks = []\n'
' i = 0\n'
' while i < len(lst):\n'
' chunks.append(lst[i:i+size])\n'
' i += size\n'
' return chunks',
'initial_error': 'AssertionError: expected [[1,2],[3]], got [[1,2]]',
'bug_location': {'function': 'get_chunks', 'line_start': 4},
'test_cases': [{'input': [[1, 2, 3], 2], 'expected_output': [[1, 2], [3]]},
{'input': [[1, 2], 2], 'expected_output': [[1, 2]]},
{'input': [[1, 2, 3, 4], 2], 'expected_output': [[1, 2], [3, 4]]},
{'input': [[], 2], 'expected_output': []}]},
{'id': 't2_011',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'sum_even_numbers',
'buggy_code': 'def sum_even_numbers(nums):\n'
' total = 1\n'
' for n in nums:\n'
' if n % 2 == 0:\n'
' total += n\n'
' return total',
'original_code': 'def sum_even_numbers(nums):\n'
' total = 0\n'
' for n in nums:\n'
' if n % 2 == 0:\n'
' total += n\n'
' return total',
'initial_error': 'AssertionError: expected 6, got 7',
'bug_location': {'function': 'sum_even_numbers', 'line_start': 2},
'test_cases': [{'input': [[1, 2, 3, 4]], 'expected_output': 6},
{'input': [[1, 3, 5]], 'expected_output': 0},
{'input': [[2, 2]], 'expected_output': 4},
{'input': [[]], 'expected_output': 0}]},
{'id': 't2_012',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'multiply_all',
'buggy_code': 'def multiply_all(nums):\n total = 0\n for n in nums:\n total *= n\n return total',
'original_code': 'def multiply_all(nums):\n total = 1\n for n in nums:\n total *= n\n return total',
'initial_error': 'AssertionError: expected 24, got 0',
'bug_location': {'function': 'multiply_all', 'line_start': 2},
'test_cases': [{'input': [[1, 2, 3, 4]], 'expected_output': 24},
{'input': [[5]], 'expected_output': 5},
{'input': [[1, -1]], 'expected_output': -1},
{'input': [[0, 5]], 'expected_output': 0}]},
{'id': 't2_013',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'concatenate_strings',
'buggy_code': 'def concatenate_strings(strs):\n'
' res = strs[0]\n'
' for s in strs:\n'
' res += s\n'
' return res',
'original_code': "def concatenate_strings(strs):\n res = ''\n for s in strs:\n res += s\n return res",
'initial_error': "AssertionError: expected 'abc', got 'aabc'",
'bug_location': {'function': 'concatenate_strings', 'line_start': 2},
'test_cases': [{'input': [['a', 'b', 'c']], 'expected_output': 'abc'},
{'input': [['hello', 'world']], 'expected_output': 'helloworld'},
{'input': [['a']], 'expected_output': 'a'},
{'input': [['x', 'y']], 'expected_output': 'xy'}]},
{'id': 't2_014',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'max_profit',
'buggy_code': 'def max_profit(prices):\n'
' min_price = 0\n'
' max_prof = 0\n'
' for price in prices:\n'
' min_price = min(min_price, price)\n'
' max_prof = max(max_prof, price - min_price)\n'
' return max_prof',
'original_code': 'def max_profit(prices):\n'
" min_price = float('inf')\n"
' max_prof = 0\n'
' for price in prices:\n'
' min_price = min(min_price, price)\n'
' max_prof = max(max_prof, price - min_price)\n'
' return max_prof',
'initial_error': 'AssertionError: expected 5, got 6',
'bug_location': {'function': 'max_profit', 'line_start': 2},
'test_cases': [{'input': [[7, 1, 5, 3, 6, 4]], 'expected_output': 5},
{'input': [[7, 6, 4, 3, 1]], 'expected_output': 0},
{'input': [[1, 2]], 'expected_output': 1},
{'input': [[2, 4, 1]], 'expected_output': 2}]},
{'id': 't2_015',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'find_longest_word',
'buggy_code': 'def find_longest_word(words):\n'
' longest = words[0]\n'
' for word in words:\n'
' if len(word) > len(longest):\n'
' longest = longest\n'
' return longest',
'original_code': 'def find_longest_word(words):\n'
" longest = ''\n"
' for word in words:\n'
' if len(word) > len(longest):\n'
' longest = word\n'
' return longest',
'initial_error': "AssertionError: expected 'banana', got 'apple'",
'bug_location': {'function': 'find_longest_word', 'line_start': 5},
'test_cases': [{'input': [['apple', 'banana', 'kiwi']], 'expected_output': 'banana'},
{'input': [['a', 'ab', 'abc']], 'expected_output': 'abc'},
{'input': [['dog']], 'expected_output': 'dog'},
{'input': [['x', 'yz']], 'expected_output': 'yz'}]},
{'id': 't2_016',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'running_sum',
'buggy_code': 'def running_sum(nums):\n'
' res = []\n'
' current = nums[0]\n'
' for n in nums:\n'
' current += n\n'
' res.append(current)\n'
' return res',
'original_code': 'def running_sum(nums):\n'
' res = []\n'
' current = 0\n'
' for n in nums:\n'
' current += n\n'
' res.append(current)\n'
' return res',
'initial_error': 'AssertionError: expected [1, 3, 6], got [2, 4, 7]',
'bug_location': {'function': 'running_sum', 'line_start': 3},
'test_cases': [{'input': [[1, 2, 3]], 'expected_output': [1, 3, 6]},
{'input': [[1, 1, 1]], 'expected_output': [1, 2, 3]},
{'input': [[5]], 'expected_output': [5]},
{'input': [[0, 0, 0]], 'expected_output': [0, 0, 0]}]},
{'id': 't2_017',
'difficulty': 2,
'bug_type': 'incorrect_accumulation',
'function_name': 'count_negatives',
'buggy_code': 'def count_negatives(nums):\n'
' count = -1\n'
' for n in nums:\n'
' if n < 0:\n'
' count += 1\n'
' return count',
'original_code': 'def count_negatives(nums):\n'
' count = 0\n'
' for n in nums:\n'
' if n < 0:\n'
' count += 1\n'
' return count',
'initial_error': 'AssertionError: expected 2, got 1',
'bug_location': {'function': 'count_negatives', 'line_start': 2},
'test_cases': [{'input': [[1, -1, 2, -2]], 'expected_output': 2},
{'input': [[1, 2, 3]], 'expected_output': 0},
{'input': [[-1, -2, -3]], 'expected_output': 3},
{'input': [[]], 'expected_output': 0}]},
{'id': 't2_018',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'classify_number',
'buggy_code': 'def classify_number(n):\n'
' if n > 0:\n'
" return 'positive'\n"
' elif n < 0:\n'
" return 'negative'\n"
' elif n == 0:\n'
" return 'negative'",
'original_code': 'def classify_number(n):\n'
' if n > 0:\n'
" return 'positive'\n"
' elif n < 0:\n'
" return 'negative'\n"
' else:\n'
" return 'zero'",
'initial_error': "AssertionError: expected 'zero', got 'negative'",
'bug_location': {'function': 'classify_number', 'line_start': 6},
'test_cases': [{'input': [5], 'expected_output': 'positive'},
{'input': [-3], 'expected_output': 'negative'},
{'input': [0], 'expected_output': 'zero'},
{'input': [1], 'expected_output': 'positive'}]},
{'id': 't2_019',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'get_discount',
'buggy_code': 'def get_discount(price):\n'
' if price > 100:\n'
' return 20\n'
' if price > 50:\n'
' return 50\n'
' return 0',
'original_code': 'def get_discount(price):\n'
' if price > 100:\n'
' return 20\n'
' elif price > 50:\n'
' return 10\n'
' return 0',
'initial_error': 'AssertionError: expected 10, got 50',
'bug_location': {'function': 'get_discount', 'line_start': 5},
'test_cases': [{'input': [150], 'expected_output': 20},
{'input': [75], 'expected_output': 10},
{'input': [50], 'expected_output': 0},
{'input': [20], 'expected_output': 0}]},
{'id': 't2_020',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'fizz_buzz',
'buggy_code': 'def fizz_buzz(n):\n'
' if n % 3 == 0:\n'
" return 'Fizz'\n"
' if n % 5 == 0:\n'
" return 'Buzz'\n"
' if n % 15 == 0:\n'
" return 'FizzBuzz'\n"
' return str(n)',
'original_code': 'def fizz_buzz(n):\n'
' if n % 15 == 0:\n'
" return 'FizzBuzz'\n"
' if n % 3 == 0:\n'
" return 'Fizz'\n"
' if n % 5 == 0:\n'
" return 'Buzz'\n"
' return str(n)',
'initial_error': "AssertionError: expected 'FizzBuzz', got 'Fizz'",
'bug_location': {'function': 'fizz_buzz', 'line_start': 2},
'test_cases': [{'input': [3], 'expected_output': 'Fizz'},
{'input': [5], 'expected_output': 'Buzz'},
{'input': [15], 'expected_output': 'FizzBuzz'},
{'input': [2], 'expected_output': '2'}]},
{'id': 't2_021',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'is_leap_year',
'buggy_code': 'def is_leap_year(year):\n'
' if year % 4 == 0:\n'
' if year % 100 == 0:\n'
' if year % 400 == 0:\n'
' return False\n'
' return True\n'
' return True\n'
' return False',
'original_code': 'def is_leap_year(year):\n'
' if year % 4 == 0:\n'
' if year % 100 == 0:\n'
' if year % 400 == 0:\n'
' return True\n'
' return False\n'
' return True\n'
' return False',
'initial_error': 'AssertionError: expected False, got True',
'bug_location': {'function': 'is_leap_year', 'line_start': 5},
'test_cases': [{'input': [2000], 'expected_output': True},
{'input': [1900], 'expected_output': False},
{'input': [2004], 'expected_output': True},
{'input': [2001], 'expected_output': False}]},
{'id': 't2_022',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'grade_score',
'buggy_code': 'def grade_score(score):\n'
' if score >= 90:\n'
" return 'A'\n"
' elif score >= 80:\n'
" return 'B'\n"
' elif score > 70:\n'
" return 'C'\n"
' else:\n'
" return 'F'",
'original_code': 'def grade_score(score):\n'
' if score >= 90:\n'
" return 'A'\n"
' elif score >= 80:\n'
" return 'B'\n"
' elif score >= 70:\n'
" return 'C'\n"
' else:\n'
" return 'F'",
'initial_error': "AssertionError: expected 'C', got 'F'",
'bug_location': {'function': 'grade_score', 'line_start': 6},
'test_cases': [{'input': [95], 'expected_output': 'A'},
{'input': [80], 'expected_output': 'B'},
{'input': [70], 'expected_output': 'C'},
{'input': [60], 'expected_output': 'F'}]},
{'id': 't2_023',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'can_drink_alcohol',
'buggy_code': 'def can_drink_alcohol(age, country):\n'
" if country == 'US':\n"
' if age > 21:\n'
' return True\n'
' return False\n'
' return age >= 18',
'original_code': 'def can_drink_alcohol(age, country):\n'
" if country == 'US':\n"
' if age >= 21:\n'
' return True\n'
' return False\n'
' return age >= 18',
'initial_error': 'AssertionError: expected True, got False',
'bug_location': {'function': 'can_drink_alcohol', 'line_start': 3},
'test_cases': [{'input': [21, 'US'], 'expected_output': True},
{'input': [20, 'US'], 'expected_output': False},
{'input': [18, 'UK'], 'expected_output': True},
{'input': [17, 'UK'], 'expected_output': False}]},
{'id': 't2_024',
'difficulty': 2,
'bug_type': 'wrong_conditional_branch',
'function_name': 'get_quadrant',
'buggy_code': 'def get_quadrant(x, y):\n'
' if x > 0 and y > 0:\n'
' return 1\n'
' elif x < 0 and y > 0:\n'
' return 2\n'
' elif x > 0 and y < 0:\n'
' return 3\n'
' elif x < 0 and y < 0:\n'
' return 4\n'
' return 0',
'original_code': 'def get_quadrant(x, y):\n'
' if x > 0 and y > 0:\n'
' return 1\n'
' elif x < 0 and y > 0:\n'
' return 2\n'
' elif x < 0 and y < 0:\n'
' return 3\n'
' elif x > 0 and y < 0:\n'
' return 4\n'
' return 0',
'initial_error': 'AssertionError: expected 4, got 3',
'bug_location': {'function': 'get_quadrant', 'line_start': 6},
'test_cases': [{'input': [1, 1], 'expected_output': 1},
{'input': [-1, 1], 'expected_output': 2},
{'input': [-1, -1], 'expected_output': 3},
{'input': [1, -1], 'expected_output': 4}]},
{'id': 't2_025',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'merge_arrays',
'buggy_code': 'def merge_arrays(a, b):\n res = a + b\n res.sort()\n return a',
'original_code': 'def merge_arrays(a, b):\n res = a + b\n res.sort()\n return res',
'initial_error': 'AssertionError: expected [1, 2, 3, 4], got [1, 3]',
'bug_location': {'function': 'merge_arrays', 'line_start': 4},
'test_cases': [{'input': [[1, 3], [2, 4]], 'expected_output': [1, 2, 3, 4]},
{'input': [[], [1]], 'expected_output': [1]},
{'input': [[2], [1]], 'expected_output': [1, 2]},
{'input': [[], []], 'expected_output': []}]},
{'id': 't2_026',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'find_min_max',
'buggy_code': 'def find_min_max(nums):\n'
' if not nums:\n'
' return None\n'
' mn = min(nums)\n'
' mx = max(nums)\n'
' return [mn, mn]',
'original_code': 'def find_min_max(nums):\n'
' if not nums:\n'
' return None\n'
' mn = min(nums)\n'
' mx = max(nums)\n'
' return [mn, mx]',
'initial_error': 'AssertionError: expected (1, 5), got (1, 1)',
'bug_location': {'function': 'find_min_max', 'line_start': 6},
'test_cases': [{'input': [[1, 2, 5]], 'expected_output': [1, 5]},
{'input': [[3, 3]], 'expected_output': [3, 3]},
{'input': [[-1, 0, 1]], 'expected_output': [-1, 1]},
{'input': [[]], 'expected_output': None}]},
{'id': 't2_027',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'remove_evens',
'buggy_code': 'def remove_evens(nums):\n'
' res = []\n'
' for n in nums:\n'
' if n % 2 != 0:\n'
' res.append(n)\n'
' return nums',
'original_code': 'def remove_evens(nums):\n'
' res = []\n'
' for n in nums:\n'
' if n % 2 != 0:\n'
' res.append(n)\n'
' return res',
'initial_error': 'AssertionError: expected [1, 3], got [1, 2, 3]',
'bug_location': {'function': 'remove_evens', 'line_start': 6},
'test_cases': [{'input': [[1, 2, 3]], 'expected_output': [1, 3]},
{'input': [[2, 4]], 'expected_output': []},
{'input': [[1, 3]], 'expected_output': [1, 3]},
{'input': [[]], 'expected_output': []}]},
{'id': 't2_028',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'duplicate_list',
'buggy_code': 'def duplicate_list(lst):\n res = lst[:]\n res.extend(lst)\n return lst',
'original_code': 'def duplicate_list(lst):\n res = lst[:]\n res.extend(lst)\n return res',
'initial_error': 'AssertionError: expected [1, 1], got [1]',
'bug_location': {'function': 'duplicate_list', 'line_start': 4},
'test_cases': [{'input': [[1]], 'expected_output': [1, 1]},
{'input': [[1, 2]], 'expected_output': [1, 2, 1, 2]},
{'input': [[]], 'expected_output': []},
{'input': [[0]], 'expected_output': [0, 0]}]},
{'id': 't2_029',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'swap_halves',
'buggy_code': 'def swap_halves(lst):\n'
' mid = len(lst) // 2\n'
' left = lst[:mid]\n'
' right = lst[mid:]\n'
' return left + left',
'original_code': 'def swap_halves(lst):\n'
' mid = len(lst) // 2\n'
' left = lst[:mid]\n'
' right = lst[mid:]\n'
' return right + left',
'initial_error': 'AssertionError: expected [3, 4, 1, 2], got [1, 2, 1, 2]',
'bug_location': {'function': 'swap_halves', 'line_start': 5},
'test_cases': [{'input': [[1, 2, 3, 4]], 'expected_output': [3, 4, 1, 2]},
{'input': [[1, 2, 3]], 'expected_output': [2, 3, 1]},
{'input': [[1]], 'expected_output': [1]},
{'input': [[]], 'expected_output': []}]},
{'id': 't2_030',
'difficulty': 2,
'bug_type': 'wrong_variable',
'function_name': 'get_initials',
'buggy_code': 'def get_initials(name):\n'
' words = name.split()\n'
' initials = [w[0].upper() for w in words]\n'
" return ''.join(words)",
'original_code': 'def get_initials(name):\n'
' words = name.split()\n'
' initials = [w[0].upper() for w in words]\n'
" return ''.join(initials)",
'initial_error': "AssertionError: expected 'JD', got 'JohnDoe'",
'bug_location': {'function': 'get_initials', 'line_start': 4},
'test_cases': [{'input': ['John Doe'], 'expected_output': 'JD'},
{'input': ['Alice'], 'expected_output': 'A'},
{'input': ['bob smith junior'], 'expected_output': 'BSJ'},
{'input': [''], 'expected_output': ''}]}]
TIER3_BUGS = [{'id': 't3_001',
'difficulty': 3,
'bug_type': 'edge_case_only',
'function_name': 'merge_sorted',
'buggy_code': 'def merge_sorted(a, b):\n'
' result = []\n'
' i = j = 0\n'
' while i < len(a) and j < len(b):\n'
' if a[i] <= b[j]:\n'
' result.append(a[i])\n'
' i += 1\n'
' else:\n'
' result.append(b[j])\n'
' j += 1\n'
' return result',
'original_code': 'def merge_sorted(a, b):\n'
' result = []\n'
' i = j = 0\n'
' while i < len(a) and j < len(b):\n'
' if a[i] <= b[j]:\n'
' result.append(a[i])\n'
' i += 1\n'
' else:\n'
' result.append(b[j])\n'
' j += 1\n'
' result.extend(a[i:])\n'
' result.extend(b[j:])\n'
' return result',
'initial_error': 'AssertionError: merge_sorted([1,3],[2,4,5]) expected [1,2,3,4,5], got [1,2,3]',
'bug_location': {'function': 'merge_sorted', 'line_start': 11},
'test_cases': [{'input': [[1, 3], [2, 4, 5]], 'expected_output': [1, 2, 3, 4, 5]},
{'input': [[], [1, 2]], 'expected_output': [1, 2]},
{'input': [[1, 2], []], 'expected_output': [1, 2]},
{'input': [[1], [2]], 'expected_output': [1, 2]}]},
{'id': 't3_002',
'difficulty': 3,
'bug_type': 'subtle_logic',
'function_name': 'rotate_matrix',
'buggy_code': 'def rotate_matrix(matrix):\n'
' n = len(matrix)\n'
' for i in range(n):\n'
' for j in range(i, n):\n'
' matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]\n'
' return matrix',
'original_code': 'def rotate_matrix(matrix):\n'
' n = len(matrix)\n'
' for i in range(n):\n'
' for j in range(i, n):\n'
' matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]\n'
' for row in matrix:\n'
' row.reverse()\n'
' return matrix',
'initial_error': 'AssertionError: rotate_matrix([[1,2],[3,4]]) expected [[3,1],[4,2]], got [[1,3],[2,4]]',
'bug_location': {'function': 'rotate_matrix', 'line_start': 6},
'test_cases': [{'input': [[[1, 2], [3, 4]]], 'expected_output': [[3, 1], [4, 2]]},
{'input': [[[1, 2, 3], [4, 5, 6], [7, 8, 9]]], 'expected_output': [[7, 4, 1], [8, 5, 2], [9, 6, 3]]}]},
{'id': 't3_003',
'difficulty': 3,
'bug_type': 'wrong_argument_order',
'function_name': 'process_user',
'buggy_code': 'def format_name(first, last):\n'
" return f'{last}, {first}'\n"
'\n'
'def process_user(first_name, last_name):\n'
' return format_name(last_name, first_name)',
'original_code': 'def format_name(first, last):\n'
" return f'{last}, {first}'\n"
'\n'
'def process_user(first_name, last_name):\n'
' return format_name(first_name, last_name)',
'initial_error': "AssertionError: expected 'Doe, John', got 'John, Doe'",
'bug_location': {'function': 'process_user', 'line_start': 5},
'test_cases': [{'input': ['John', 'Doe'], 'expected_output': 'Doe, John'},
{'input': ['Alice', 'Smith'], 'expected_output': 'Smith, Alice'},
{'input': ['A', 'B'], 'expected_output': 'B, A'},
{'input': ['X', 'Y'], 'expected_output': 'Y, X'}]},
{'id': 't3_004',
'difficulty': 3,
'bug_type': 'wrong_argument_order',
'function_name': 'calculate_total',
'buggy_code': 'def apply_discount(price, discount):\n'
' return price - (price * discount)\n'
'\n'
'def calculate_total(price, discount_rate):\n'
' return apply_discount(discount_rate, price)',
'original_code': 'def apply_discount(price, discount):\n'
' return price - (price * discount)\n'
'\n'
'def calculate_total(price, discount_rate):\n'
' return apply_discount(price, discount_rate)',
'initial_error': 'AssertionError: expected 80.0, got -19.8',
'bug_location': {'function': 'calculate_total', 'line_start': 5},
'test_cases': [{'input': [100, 0.2], 'expected_output': 80.0},
{'input': [50, 0.1], 'expected_output': 45.0},
{'input': [200, 0.5], 'expected_output': 100.0},
{'input': [10, 0.0], 'expected_output': 10.0}]},
{'id': 't3_005',
'difficulty': 3,
'bug_type': 'wrong_argument_order',
'function_name': 'build_url',
'buggy_code': 'def join_parts(domain, path):\n'
" return f'https://{domain}/{path}'\n"
'\n'
'def build_url(domain, path):\n'
' return join_parts(path, domain)',
'original_code': 'def join_parts(domain, path):\n'
" return f'https://{domain}/{path}'\n"
'\n'
'def build_url(domain, path):\n'
' return join_parts(domain, path)',
'initial_error': "AssertionError: expected 'https://example.com/api', got 'https://api/example.com'",
'bug_location': {'function': 'build_url', 'line_start': 5},
'test_cases': [{'input': ['example.com', 'api'], 'expected_output': 'https://example.com/api'},
{'input': ['google.com', 'search'], 'expected_output': 'https://google.com/search'},
{'input': ['a.com', 'b'], 'expected_output': 'https://a.com/b'},
{'input': ['x.org', 'y'], 'expected_output': 'https://x.org/y'}]},
{'id': 't3_006',
'difficulty': 3,
'bug_type': 'wrong_argument_order',
'function_name': 'divide_numbers',
'buggy_code': 'def safe_divide(num, den):\n'
' if den == 0:\n'
' return 0\n'
' return num / den\n'
'\n'
'def divide_numbers(a, b):\n'
' return safe_divide(b, a)',
'original_code': 'def safe_divide(num, den):\n'
' if den == 0:\n'
' return 0\n'
' return num / den\n'
'\n'
'def divide_numbers(a, b):\n'
' return safe_divide(a, b)',
'initial_error': 'AssertionError: expected 2.0, got 0.5',
'bug_location': {'function': 'divide_numbers', 'line_start': 7},
'test_cases': [{'input': [10, 5], 'expected_output': 2.0},
{'input': [5, 0], 'expected_output': 0},
{'input': [100, 10], 'expected_output': 10.0},
{'input': [0, 5], 'expected_output': 0.0}]},
{'id': 't3_007',
'difficulty': 3,
'bug_type': 'wrong_argument_order',
'function_name': 'create_rectangle',
'buggy_code': 'def calc_area(w, h):\n'
' return w * h\n'
'\n'
'def create_rectangle(width, height):\n'
" return {'w': width, 'h': height, 'area': calc_area(height, height)}",
'original_code': 'def calc_area(w, h):\n'
' return w * h\n'
'\n'
'def create_rectangle(width, height):\n'
" return {'w': width, 'h': height, 'area': calc_area(width, height)}",
'initial_error': "AssertionError: doesn't strictly fail math but conceptually wrong",
'bug_location': {'function': 'create_rectangle', 'line_start': 5},
'test_cases': [{'input': [5, 10], 'expected_output': {'w': 5, 'h': 10, 'area': 50}},
{'input': [2, 3], 'expected_output': {'w': 2, 'h': 3, 'area': 6}},
{'input': [1, 1], 'expected_output': {'w': 1, 'h': 1, 'area': 1}},
{'input': [0, 5], 'expected_output': {'w': 0, 'h': 5, 'area': 0}}]},
{'id': 't3_008',
'difficulty': 3,
'bug_type': 'wrong_argument_order',
'function_name': 'power_wrapper',
'buggy_code': 'def compute_pow(base, exp):\n'
' return base ** exp\n'
'\n'
'def power_wrapper(base, exp):\n'
' return compute_pow(exp, base)',
'original_code': 'def compute_pow(base, exp):\n'
' return base ** exp\n'
'\n'
'def power_wrapper(base, exp):\n'
' return compute_pow(base, exp)',
'initial_error': 'AssertionError: expected 8, got 9',
'bug_location': {'function': 'power_wrapper', 'line_start': 5},
'test_cases': [{'input': [2, 3], 'expected_output': 8},
{'input': [3, 2], 'expected_output': 9},
{'input': [5, 2], 'expected_output': 25},
{'input': [2, 4], 'expected_output': 16}]},
{'id': 't3_009',
'difficulty': 3,
'bug_type': 'state_not_reset',
'function_name': 'get_unique_items',
'buggy_code': 'seen = {1}\n'
'def filter_unique(items):\n'
' res = []\n'
' for item in items:\n'
' if item not in seen:\n'
' seen.add(item)\n'
' res.append(item)\n'
' return res\n'
'\n'
'def get_unique_items(items):\n'
' return filter_unique(items)',
'original_code': 'def filter_unique(items, seen):\n'
' res = []\n'
' for item in items:\n'
' if item not in seen:\n'
' seen.add(item)\n'
' res.append(item)\n'
' return res\n'
'\n'
'def get_unique_items(items):\n'
' return filter_unique(items, set())',
'initial_error': 'AssertionError: test fails on second call',
'bug_location': {'function': 'filter_unique', 'line_start': 4},
'test_cases': [{'input': [[1, 2, 2, 3]], 'expected_output': [1, 2, 3]},
{'input': [[1, 2, 2, 3]], 'expected_output': [1, 2, 3]},
{'input': [[4, 4, 5]], 'expected_output': [4, 5]},
{'input': [[4, 4, 5]], 'expected_output': [4, 5]}]},
{'id': 't3_010',
'difficulty': 3,
'bug_type': 'state_not_reset',
'function_name': 'accumulate_values',
'buggy_code': 'total = 10\n'
'def add_to_total(val):\n'
' global total\n'
' total += val\n'
' return total\n'
'\n'
'def accumulate_values(vals):\n'
' return [add_to_total(v) for v in vals]',
'original_code': 'def accumulate_values(vals):\n'
' total = 0\n'
' res = []\n'
' for v in vals:\n'
' total += v\n'
' res.append(total)\n'
' return res',
'initial_error': 'AssertionError: expected [1, 3], got [1, 3] then [4, 6] on next call',
'bug_location': {'function': 'add_to_total', 'line_start': 4},
'test_cases': [{'input': [[1, 2]], 'expected_output': [1, 3]},
{'input': [[1, 2]], 'expected_output': [1, 3]},
{'input': [[5, 5]], 'expected_output': [5, 10]},
{'input': [[5, 5]], 'expected_output': [5, 10]}]},
{'id': 't3_011',
'difficulty': 3,
'bug_type': 'state_not_reset',
'function_name': 'append_to_default',
'buggy_code': 'def helper(val, lst=[1]):\n'
' lst.append(val)\n'
' return lst\n'
'\n'
'def append_to_default(val):\n'
' return helper(val)',
'original_code': 'def helper(val, lst=None):\n'
' if lst is None:\n'
' lst = []\n'
' lst.append(val)\n'
' return lst\n'
'\n'
'def append_to_default(val):\n'
' return helper(val)',
'initial_error': 'AssertionError: expected [2], got [1, 2]',
'bug_location': {'function': 'helper', 'line_start': 1},
'test_cases': [{'input': [1], 'expected_output': [1]},
{'input': [2], 'expected_output': [2]},
{'input': [3], 'expected_output': [3]},
{'input': [4], 'expected_output': [4]}]},
{'id': 't3_012',
'difficulty': 3,
'bug_type': 'state_not_reset',
'function_name': 'count_calls',
'buggy_code': 'calls = 5\n'
'def tracker():\n'
' global calls\n'
' calls += 1\n'
' return calls\n'
'\n'
'def count_calls(n):\n'
' res = []\n'
' for _ in range(n):\n'
' res.append(tracker())\n'
' return res',
'original_code': 'def count_calls(n):\n'
' calls = 0\n'
' res = []\n'
' for _ in range(n):\n'
' calls += 1\n'
' res.append(calls)\n'
' return res',
'initial_error': 'AssertionError: expected [1, 2], got [3, 4] on second run',
'bug_location': {'function': 'tracker', 'line_start': 4},
'test_cases': [{'input': [2], 'expected_output': [1, 2]},
{'input': [2], 'expected_output': [1, 2]},
{'input': [3], 'expected_output': [1, 2, 3]},
{'input': [3], 'expected_output': [1, 2, 3]}]},
{'id': 't3_013',
'difficulty': 3,
'bug_type': 'state_not_reset',
'function_name': 'build_sentence',
'buggy_code': "words_cache = ['ERROR']\n"
'def add_word(w):\n'
' words_cache.append(w)\n'
" return ' '.join(words_cache)\n"
'\n'
'def build_sentence(words):\n'
" res = ''\n"
' for w in words:\n'
' res = add_word(w)\n'
' return res',
'original_code': 'def build_sentence(words):\n'
' words_cache = []\n'
' def add_word(w):\n'
' words_cache.append(w)\n'
" return ' '.join(words_cache)\n"
" res = ''\n"
' for w in words:\n'
' res = add_word(w)\n'
' return res',
'initial_error': "AssertionError: expected 'hello world', got '... hello world'",
'bug_location': {'function': 'add_word', 'line_start': 3},
'test_cases': [{'input': [['hello', 'world']], 'expected_output': 'hello world'},
{'input': [['foo', 'bar']], 'expected_output': 'foo bar'},
{'input': [['a', 'b', 'c']], 'expected_output': 'a b c'},
{'input': [['x']], 'expected_output': 'x'}]},
{'id': 't3_014',
'difficulty': 3,
'bug_type': 'state_not_reset',
'function_name': 'collect_errors',
'buggy_code': "errors = ['fatal']\n"
'def log_error(err):\n'
' errors.append(err)\n'
' return errors\n'
'\n'
'def collect_errors(err_list):\n'
' for e in err_list:\n'
' res = log_error(e)\n'
' return res if err_list else []',
'original_code': 'def collect_errors(err_list):\n'
' errors = []\n'
' def log_error(err):\n'
' errors.append(err)\n'
' return errors\n'
' res = []\n'
' for e in err_list:\n'
' res = log_error(e)\n'
' return res',
'initial_error': 'AssertionError: state leak between calls',
'bug_location': {'function': 'log_error', 'line_start': 3},
'test_cases': [{'input': [['e1']], 'expected_output': ['e1']},
{'input': [['e2']], 'expected_output': ['e2']},
{'input': [['e3', 'e4']], 'expected_output': ['e3', 'e4']},
{'input': [['e5']], 'expected_output': ['e5']}]},
{'id': 't3_015',
'difficulty': 3,
'bug_type': 'missing_edge_case',
'function_name': 'process_data',
'buggy_code': 'def get_first(lst):\n'
' return lst[0]\n'
'\n'
'def process_data(data):\n'
' if not data:\n'
' return None\n'
' return [get_first(d) for d in data]',
'original_code': 'def get_first(lst):\n'
' if not lst:\n'
' return None\n'
' return lst[0]\n'
'\n'
'def process_data(data):\n'
' if not data:\n'
' return []\n'
' return [get_first(d) for d in data]',
'initial_error': 'IndexError: list index out of range',
'bug_location': {'function': 'get_first', 'line_start': 2},
'test_cases': [{'input': [[[1, 2], [3, 4]]], 'expected_output': [1, 3]},
{'input': [[[1], []]], 'expected_output': [1, None]},
{'input': [[[], [2]]], 'expected_output': [None, 2]},
{'input': [[]], 'expected_output': []}]},
{'id': 't3_016',
'difficulty': 3,
'bug_type': 'missing_edge_case',
'function_name': 'average_scores',
'buggy_code': 'def calc_avg(scores):\n'
' return sum(scores) / len(scores)\n'
'\n'
'def average_scores(students):\n'
' return {k: calc_avg(v) for k, v in students.items()}',
'original_code': 'def calc_avg(scores):\n'
' if not scores:\n'
' return 0\n'
' return sum(scores) / len(scores)\n'
'\n'
'def average_scores(students):\n'
' return {k: calc_avg(v) for k, v in students.items()}',
'initial_error': 'ZeroDivisionError: division by zero',
'bug_location': {'function': 'calc_avg', 'line_start': 2},
'test_cases': [{'input': [{'Alice': [10, 20], 'Bob': []}], 'expected_output': {'Alice': 15.0, 'Bob': 0}},
{'input': [{'A': [5]}], 'expected_output': {'A': 5.0}},
{'input': [{}], 'expected_output': {}},
{'input': [{'B': []}], 'expected_output': {'B': 0}}]},
{'id': 't3_017',
'difficulty': 3,
'bug_type': 'missing_edge_case',
'function_name': 'find_max_nested',
'buggy_code': 'def find_max(lst):\n'
' return max(lst)\n'
'\n'
'def find_max_nested(nested_lists):\n'
' return [find_max(l) for l in nested_lists]',
'original_code': 'def find_max(lst):\n'
' if not lst:\n'
' return None\n'
' return max(lst)\n'
'\n'
'def find_max_nested(nested_lists):\n'
' return [find_max(l) for l in nested_lists]',
'initial_error': 'ValueError: max() arg is an empty sequence',
'bug_location': {'function': 'find_max', 'line_start': 2},
'test_cases': [{'input': [[[1, 2], []]], 'expected_output': [2, None]},
{'input': [[[1], [2, 3]]], 'expected_output': [1, 3]},
{'input': [[[], []]], 'expected_output': [None, None]},
{'input': [[]], 'expected_output': []}]},
{'id': 't3_018',
'difficulty': 3,
'bug_type': 'missing_edge_case',
'function_name': 'get_extensions',
'buggy_code': 'def extract_ext(filename):\n'
" return filename.split('.')[1]\n"
'\n'
'def get_extensions(files):\n'
' return [extract_ext(f) for f in files]',
'original_code': 'def extract_ext(filename):\n'
" parts = filename.split('.')\n"
' if len(parts) < 2:\n'
" return ''\n"
' return parts[-1]\n'
'\n'
'def get_extensions(files):\n'
' return [extract_ext(f) for f in files]',
'initial_error': 'IndexError: list index out of range',
'bug_location': {'function': 'extract_ext', 'line_start': 2},
'test_cases': [{'input': [['a.txt', 'b']], 'expected_output': ['txt', '']},
{'input': [['a.txt', 'b.pdf']], 'expected_output': ['txt', 'pdf']},
{'input': [['noext']], 'expected_output': ['']},
{'input': [[]], 'expected_output': []}]},
{'id': 't3_019',
'difficulty': 3,
'bug_type': 'missing_edge_case',
'function_name': 'get_lengths',
'buggy_code': 'def get_len(item):\n'
' return len(item)\n'
'\n'
'def get_lengths(items):\n'
' return [get_len(i) for i in items]',
'original_code': 'def get_len(item):\n'
' if item is None:\n'
' return 0\n'
' return len(item)\n'
'\n'
'def get_lengths(items):\n'
' return [get_len(i) for i in items]',
'initial_error': "TypeError: object of type 'NoneType' has no len()",
'bug_location': {'function': 'get_len', 'line_start': 2},
'test_cases': [{'input': [['abc', None]], 'expected_output': [3, 0]},
{'input': [['a', 'b']], 'expected_output': [1, 1]},
{'input': [[None, None]], 'expected_output': [0, 0]},
{'input': [[]], 'expected_output': []}]},
{'id': 't3_020',
'difficulty': 3,
'bug_type': 'missing_edge_case',
'function_name': 'parse_integers',
'buggy_code': 'def to_int(s):\n'
' return int(s)\n'
'\n'
'def parse_integers(strings):\n'
' return [to_int(s) for s in strings]',
'original_code': 'def to_int(s):\n'
' try:\n'
' return int(s)\n'
' except ValueError:\n'
' return 0\n'
'\n'
'def parse_integers(strings):\n'
' return [to_int(s) for s in strings]',
'initial_error': 'ValueError: invalid literal for int() with base 10',
'bug_location': {'function': 'to_int', 'line_start': 2},
'test_cases': [{'input': [['1', 'abc']], 'expected_output': [1, 0]},
{'input': [['1', '2']], 'expected_output': [1, 2]},
{'input': [['foo', 'bar']], 'expected_output': [0, 0]},
{'input': [[]], 'expected_output': []}]}]
def write_jsonl(bugs: list, path: str):
with open(path, "w") as f:
for bug in bugs:
f.write(json.dumps(bug) + "\n")
if __name__ == "__main__":
os.makedirs("data", exist_ok=True)
write_jsonl(TIER1_BUGS, "data/bugs_tier1.jsonl")
write_jsonl(TIER2_BUGS, "data/bugs_tier2.jsonl")
write_jsonl(TIER3_BUGS, "data/bugs_tier3.jsonl")
print(f"Tier 1: {len(TIER1_BUGS)}, Tier 2: {len(TIER2_BUGS)}, Tier 3: {len(TIER3_BUGS)}")
print("\nDone. Run training/train_grpo.py to start training.")