""" 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.")