debugarena / bugs.py
BharathVikas's picture
Upload 2 files
105ceb4 verified
Raw
History Blame Contribute Delete
30.9 kB
"""
DebugArena — bugs.py
======================
The "curriculum" — a collection of buggy Python functions
with test cases. The environment randomly picks one each episode.
Each bug has:
- buggy_code : the broken function the agent must fix
- correct_code : the solution (used to verify fixes)
- tests : list of (input, expected_output) pairs
- category : type of bug
- difficulty : easy / medium / hard
- hint : plain-English hint shown to the agent
Adding more bugs here = richer training data.
Judges love seeing a well-designed curriculum.
"""
BUGS = [
# ── EASY: Logic errors ────────────────────────────────────
{
"id": "bug_001",
"name": "Addition returns subtraction",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def add(a, b):
return a - b""",
"correct_code": """def add(a, b):
return a + b""",
"tests": [
{"input": (2, 3), "expected": 5},
{"input": (0, 0), "expected": 0},
{"input": (-1, 1), "expected": 0},
{"input": (10, 20), "expected": 30},
],
"hint": "Check the operator being used."
},
{
"id": "bug_002",
"name": "Max returns min",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def find_max(nums):
return min(nums)""",
"correct_code": """def find_max(nums):
return max(nums)""",
"tests": [
{"input": ([1, 5, 3],), "expected": 5},
{"input": ([10, 2, 8],), "expected": 10},
{"input": ([-1, -5, -2],),"expected": -1},
],
"hint": "The function name says 'max' but something else is being returned."
},
{
"id": "bug_003",
"name": "Wrong comparison operator",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def is_adult(age):
if age < 18:
return True
return False""",
"correct_code": """def is_adult(age):
if age >= 18:
return True
return False""",
"tests": [
{"input": (18,), "expected": True},
{"input": (17,), "expected": False},
{"input": (25,), "expected": True},
{"input": (0,), "expected": False},
],
"hint": "Check the comparison direction."
},
# ── EASY: Off-by-one errors ───────────────────────────────
{
"id": "bug_004",
"name": "Range off by one",
"category": "off_by_one",
"difficulty": "easy",
"buggy_code": """def sum_to_n(n):
total = 0
for i in range(n):
total += i
return total""",
"correct_code": """def sum_to_n(n):
total = 0
for i in range(n + 1):
total += i
return total""",
"tests": [
{"input": (5,), "expected": 15},
{"input": (3,), "expected": 6},
{"input": (1,), "expected": 1},
{"input": (10,), "expected": 55},
],
"hint": "range(n) goes from 0 to n-1. Should it include n?"
},
{
"id": "bug_005",
"name": "List index off by one",
"category": "off_by_one",
"difficulty": "easy",
"buggy_code": """def get_last(items):
return items[len(items)]""",
"correct_code": """def get_last(items):
return items[len(items) - 1]""",
"tests": [
{"input": ([1, 2, 3],), "expected": 3},
{"input": (["a", "b"],), "expected": "b"},
{"input": ([42],), "expected": 42},
],
"hint": "Python lists are 0-indexed. What's the index of the last element?"
},
# ── MEDIUM: Type errors ───────────────────────────────────
{
"id": "bug_006",
"name": "String not converted to int",
"category": "type",
"difficulty": "medium",
"buggy_code": """def double_number(s):
return s * 2""",
"correct_code": """def double_number(s):
return int(s) * 2""",
"tests": [
{"input": ("5",), "expected": 10},
{"input": ("3",), "expected": 6},
{"input": ("0",), "expected": 0},
],
"hint": "The input is a string. What needs to happen before multiplying?"
},
{
"id": "bug_007",
"name": "Integer division instead of float",
"category": "type",
"difficulty": "medium",
"buggy_code": """def average(nums):
return sum(nums) // len(nums)""",
"correct_code": """def average(nums):
return sum(nums) / len(nums)""",
"tests": [
{"input": ([1, 2, 3],), "expected": 2.0},
{"input": ([1, 2],), "expected": 1.5},
{"input": ([10, 20, 30],), "expected": 20.0},
],
"hint": "One operator does integer division, the other does float division."
},
# ── MEDIUM: Edge case bugs ────────────────────────────────
{
"id": "bug_008",
"name": "No empty list handling",
"category": "edge_case",
"difficulty": "medium",
"buggy_code": """def safe_divide(a, b):
return a / b""",
"correct_code": """def safe_divide(a, b):
if b == 0:
return None
return a / b""",
"tests": [
{"input": (10, 2), "expected": 5.0},
{"input": (9, 3), "expected": 3.0},
{"input": (5, 0), "expected": None},
],
"hint": "What happens when the second argument is zero?"
},
{
"id": "bug_009",
"name": "Doesn't handle negative input",
"category": "edge_case",
"difficulty": "medium",
"buggy_code": """def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)""",
"correct_code": """def factorial(n):
if n < 0:
return None
if n == 0:
return 1
return n * factorial(n - 1)""",
"tests": [
{"input": (5,), "expected": 120},
{"input": (0,), "expected": 1},
{"input": (3,), "expected": 6},
{"input": (-1,), "expected": None},
],
"hint": "What should happen for negative inputs?"
},
# ── HARD: Logic bugs ──────────────────────────────────────
{
"id": "bug_010",
"name": "Palindrome check broken",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def is_palindrome(s):
return s == s[1:-1]""",
"correct_code": """def is_palindrome(s):
return s == s[::-1]""",
"tests": [
{"input": ("racecar",), "expected": True},
{"input": ("hello",), "expected": False},
{"input": ("aba",), "expected": True},
{"input": ("a",), "expected": True},
{"input": ("ab",), "expected": False},
],
"hint": "How do you reverse a string in Python?"
},
{
"id": "bug_011",
"name": "FizzBuzz wrong order",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def fizzbuzz(n):
if n % 3 == 0:
return "Fizz"
elif n % 5 == 0:
return "Buzz"
elif n % 15 == 0:
return "FizzBuzz"
return str(n)""",
"correct_code": """def fizzbuzz(n):
if n % 15 == 0:
return "FizzBuzz"
elif n % 3 == 0:
return "Fizz"
elif n % 5 == 0:
return "Buzz"
return str(n)""",
"tests": [
{"input": (15,), "expected": "FizzBuzz"},
{"input": (3,), "expected": "Fizz"},
{"input": (5,), "expected": "Buzz"},
{"input": (7,), "expected": "7"},
],
"hint": "Order of conditions matters. Which check should come first?"
},
{
"id": "bug_012",
"name": "Binary search wrong boundary",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def binary_search(arr, target):
left, right = 0, len(arr)
while left < right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid
return -1""",
"correct_code": """def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1""",
"tests": [
{"input": ([1,3,5,7,9], 5), "expected": 2},
{"input": ([1,3,5,7,9], 1), "expected": 0},
{"input": ([1,3,5,7,9], 9), "expected": 4},
{"input": ([1,3,5,7,9], 4), "expected": -1},
],
"hint": "Check the initial boundary and the loop condition."
},
# ── EASY: Logic ───────────────────────────────────────────
{
"id": "bug_013",
"name": "Multiply returns addition",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def multiply(a, b):
return a + b""",
"correct_code": """def multiply(a, b):
return a * b""",
"tests": [
{"input": (3, 4), "expected": 12},
{"input": (0, 5), "expected": 0},
{"input": (-2, 3), "expected": -6},
{"input": (7, 7), "expected": 49},
],
"hint": "Check the operator."
},
{
"id": "bug_014",
"name": "Even check uses wrong operator",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def is_even(n):
return n % 2 == 1""",
"correct_code": """def is_even(n):
return n % 2 == 0""",
"tests": [
{"input": (4,), "expected": True},
{"input": (7,), "expected": False},
{"input": (0,), "expected": True},
{"input": (-2,), "expected": True},
],
"hint": "What does an even number leave as remainder when divided by 2?"
},
{
"id": "bug_015",
"name": "Absolute value returns negative",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def absolute(n):
if n < 0:
return n
return -n""",
"correct_code": """def absolute(n):
if n < 0:
return -n
return n""",
"tests": [
{"input": (-5,), "expected": 5},
{"input": (3,), "expected": 3},
{"input": (0,), "expected": 0},
{"input": (-1,), "expected": 1},
],
"hint": "The negation is applied to the wrong branch."
},
{
"id": "bug_016",
"name": "Min returns max",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def find_min(nums):
return max(nums)""",
"correct_code": """def find_min(nums):
return min(nums)""",
"tests": [
{"input": ([3, 1, 4],), "expected": 1},
{"input": ([10, 2, 8],), "expected": 2},
{"input": ([-1, -5, 0],),"expected": -5},
],
"hint": "The function name says min but something else is called."
},
{
"id": "bug_017",
"name": "Greeting uses wrong variable",
"category": "logic",
"difficulty": "easy",
"buggy_code": """def greet(name):
greeting = "Hello"
return greeting""",
"correct_code": """def greet(name):
greeting = "Hello"
return greeting + ", " + name""",
"tests": [
{"input": ("Alice",), "expected": "Hello, Alice"},
{"input": ("Bob",), "expected": "Hello, Bob"},
{"input": ("World",), "expected": "Hello, World"},
],
"hint": "The name parameter is never used in the return."
},
# ── EASY: Off by one ─────────────────────────────────────
{
"id": "bug_018",
"name": "Count starts at 1 instead of 0",
"category": "off_by_one",
"difficulty": "easy",
"buggy_code": """def count_items(lst):
count = 1
for _ in lst:
count += 1
return count""",
"correct_code": """def count_items(lst):
count = 0
for _ in lst:
count += 1
return count""",
"tests": [
{"input": ([1, 2, 3],), "expected": 3},
{"input": ([],), "expected": 0},
{"input": (["a", "b"],), "expected": 2},
],
"hint": "What should the counter start at before counting anything?"
},
{
"id": "bug_019",
"name": "Slice misses last element",
"category": "off_by_one",
"difficulty": "easy",
"buggy_code": """def get_all_but_first(lst):
return lst[1:len(lst)-1]""",
"correct_code": """def get_all_but_first(lst):
return lst[1:]""",
"tests": [
{"input": ([1, 2, 3, 4],), "expected": [2, 3, 4]},
{"input": ([5, 6],), "expected": [6]},
{"input": ([1, 2, 3],), "expected": [2, 3]},
],
"hint": "Python slices go up to but not including the end index."
},
# ── MEDIUM: Type errors ───────────────────────────────────
{
"id": "bug_020",
"name": "Concatenates instead of adds",
"category": "type",
"difficulty": "medium",
"buggy_code": """def add_numbers(a, b):
return str(a) + str(b)""",
"correct_code": """def add_numbers(a, b):
return a + b""",
"tests": [
{"input": (1, 2), "expected": 3},
{"input": (10, 20), "expected": 30},
{"input": (0, 5), "expected": 5},
],
"hint": "Converting to string before adding joins them as text."
},
{
"id": "bug_021",
"name": "Returns string instead of int",
"category": "type",
"difficulty": "medium",
"buggy_code": """def square(n):
return str(n * n)""",
"correct_code": """def square(n):
return n * n""",
"tests": [
{"input": (4,), "expected": 16},
{"input": (3,), "expected": 9},
{"input": (0,), "expected": 0},
{"input": (-2,), "expected": 4},
],
"hint": "The result should be a number, not a string."
},
{
"id": "bug_022",
"name": "Bool compared with wrong type",
"category": "type",
"difficulty": "medium",
"buggy_code": """def is_positive(n):
return n > "0" """,
"correct_code": """def is_positive(n):
return n > 0""",
"tests": [
{"input": (5,), "expected": True},
{"input": (-1,), "expected": False},
{"input": (0,), "expected": False},
],
"hint": "Comparing a number with a string causes a TypeError."
},
# ── MEDIUM: Edge cases ────────────────────────────────────
{
"id": "bug_023",
"name": "Empty string not handled",
"category": "edge_case",
"difficulty": "medium",
"buggy_code": """def first_char(s):
return s[0]""",
"correct_code": """def first_char(s):
if not s:
return None
return s[0]""",
"tests": [
{"input": ("hello",), "expected": "h"},
{"input": ("a",), "expected": "a"},
{"input": ("",), "expected": None},
],
"hint": "What happens if the string is empty?"
},
{
"id": "bug_024",
"name": "Division ignores remainder",
"category": "edge_case",
"difficulty": "medium",
"buggy_code": """def is_divisible(a, b):
return a / b == int(a / b)""",
"correct_code": """def is_divisible(a, b):
if b == 0:
return False
return a % b == 0""",
"tests": [
{"input": (10, 2), "expected": True},
{"input": (10, 3), "expected": False},
{"input": (9, 3), "expected": True},
{"input": (5, 0), "expected": False},
],
"hint": "Use modulo operator. Also handle division by zero."
},
{
"id": "bug_025",
"name": "None input not handled",
"category": "edge_case",
"difficulty": "medium",
"buggy_code": """def safe_upper(s):
return s.upper()""",
"correct_code": """def safe_upper(s):
if s is None:
return None
return s.upper()""",
"tests": [
{"input": ("hello",), "expected": "HELLO"},
{"input": ("abc",), "expected": "ABC"},
{"input": (None,), "expected": None},
],
"hint": "What happens when None is passed in?"
},
{
"id": "bug_026",
"name": "Single element list crashes",
"category": "edge_case",
"difficulty": "medium",
"buggy_code": """def second_element(lst):
return lst[1]""",
"correct_code": """def second_element(lst):
if len(lst) < 2:
return None
return lst[1]""",
"tests": [
{"input": ([1, 2, 3],), "expected": 2},
{"input": ([5, 6],), "expected": 6},
{"input": ([1],), "expected": None},
{"input": ([],), "expected": None},
],
"hint": "What if the list has fewer than 2 elements?"
},
# ── MEDIUM: Logic ─────────────────────────────────────────
{
"id": "bug_027",
"name": "AND used instead of OR",
"category": "logic",
"difficulty": "medium",
"buggy_code": """def is_weekend(day):
return day == "Saturday" and day == "Sunday" """,
"correct_code": """def is_weekend(day):
return day == "Saturday" or day == "Sunday" """,
"tests": [
{"input": ("Saturday",), "expected": True},
{"input": ("Sunday",), "expected": True},
{"input": ("Monday",), "expected": False},
{"input": ("Friday",), "expected": False},
],
"hint": "A day cannot be both Saturday AND Sunday simultaneously."
},
{
"id": "bug_028",
"name": "Wrong default return value",
"category": "logic",
"difficulty": "medium",
"buggy_code": """def contains(lst, item):
for x in lst:
if x == item:
return True
return True""",
"correct_code": """def contains(lst, item):
for x in lst:
if x == item:
return True
return False""",
"tests": [
{"input": ([1, 2, 3], 2), "expected": True},
{"input": ([1, 2, 3], 5), "expected": False},
{"input": ([], 1), "expected": False},
{"input": (["a", "b"], "c"), "expected": False},
],
"hint": "What should be returned when the item is not found?"
},
{
"id": "bug_029",
"name": "Condition is negated incorrectly",
"category": "logic",
"difficulty": "medium",
"buggy_code": """def is_leap_year(year):
return year % 4 != 0""",
"correct_code": """def is_leap_year(year):
return year % 4 == 0""",
"tests": [
{"input": (2000,), "expected": True},
{"input": (1900,), "expected": True},
{"input": (2023,), "expected": False},
{"input": (2024,), "expected": True},
],
"hint": "The condition is flipped. Leap years ARE divisible by 4."
},
# ── HARD: Logic ───────────────────────────────────────────
{
"id": "bug_030",
"name": "Bubble sort never swaps",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j] = arr[j+1]
arr[j+1] = arr[j]
return arr""",
"correct_code": """def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr""",
"tests": [
{"input": ([64, 34, 25, 12],), "expected": [12, 25, 34, 64]},
{"input": ([1, 2, 3],), "expected": [1, 2, 3]},
{"input": ([3, 1, 2],), "expected": [1, 2, 3]},
],
"hint": "The swap overwrites a value before saving it. Use tuple swap."
},
{
"id": "bug_031",
"name": "String reverse uses wrong slice",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def reverse_string(s):
return s[::2]""",
"correct_code": """def reverse_string(s):
return s[::-1]""",
"tests": [
{"input": ("hello",), "expected": "olleh"},
{"input": ("abcde",), "expected": "edcba"},
{"input": ("a",), "expected": "a"},
{"input": ("ab",), "expected": "ba"},
],
"hint": "The step value in the slice controls direction."
},
{
"id": "bug_032",
"name": "Count vowels misses uppercase",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def count_vowels(s):
count = 0
for c in s:
if c in "aeiou":
count += 1
return count""",
"correct_code": """def count_vowels(s):
count = 0
for c in s.lower():
if c in "aeiou":
count += 1
return count""",
"tests": [
{"input": ("hello",), "expected": 2},
{"input": ("HELLO",), "expected": 2},
{"input": ("Hello",), "expected": 2},
{"input": ("rhythm",), "expected": 0},
],
"hint": "Uppercase vowels are not being counted."
},
{
"id": "bug_033",
"name": "Fibonacci returns wrong base case",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def fib(n):
if n <= 0:
return 0
if n == 1:
return 0
return fib(n-1) + fib(n-2)""",
"correct_code": """def fib(n):
if n <= 0:
return 0
if n == 1:
return 1
return fib(n-1) + fib(n-2)""",
"tests": [
{"input": (1,), "expected": 1},
{"input": (2,), "expected": 1},
{"input": (5,), "expected": 5},
{"input": (7,), "expected": 13},
],
"hint": "The base case for n==1 returns the wrong value."
},
{
"id": "bug_034",
"name": "Two sum returns wrong pair",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def two_sum(nums, target):
for i in range(len(nums)):
for j in range(len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []""",
"correct_code": """def two_sum(nums, target):
for i in range(len(nums)):
for j in range(i+1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []""",
"tests": [
{"input": ([2, 7, 11, 15], 9), "expected": [0, 1]},
{"input": ([3, 2, 4], 6), "expected": [1, 2]},
{"input": ([1, 2, 3], 10), "expected": []},
],
"hint": "j should start from i+1 to avoid using the same element twice."
},
{
"id": "bug_035",
"name": "List flattener only goes one level",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def flatten(lst):
result = []
for item in lst:
if isinstance(item, list):
result.extend(item)
else:
result.append(item)
return result""",
"correct_code": """def flatten(lst):
result = []
for item in lst:
if isinstance(item, list):
result.extend(flatten(item))
else:
result.append(item)
return result""",
"tests": [
{"input": ([[1, 2], [3, 4]],), "expected": [1, 2, 3, 4]},
{"input": ([[1, [2, 3]], 4],), "expected": [1, 2, 3, 4]},
{"input": ([1, 2, 3],), "expected": [1, 2, 3]},
],
"hint": "Nested lists inside lists are not being flattened recursively."
},
# ── HARD: Algorithm bugs ──────────────────────────────────
{
"id": "bug_036",
"name": "Prime check wrong condition",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def is_prime(n):
if n < 2:
return True
for i in range(2, n):
if n % i == 0:
return False
return True""",
"correct_code": """def is_prime(n):
if n < 2:
return False
for i in range(2, n):
if n % i == 0:
return False
return True""",
"tests": [
{"input": (2,), "expected": True},
{"input": (7,), "expected": True},
{"input": (4,), "expected": False},
{"input": (1,), "expected": False},
{"input": (0,), "expected": False},
],
"hint": "Numbers less than 2 are not prime."
},
{
"id": "bug_037",
"name": "Stack pop on empty list crashes",
"category": "edge_case",
"difficulty": "hard",
"buggy_code": """def safe_pop(stack):
return stack.pop()""",
"correct_code": """def safe_pop(stack):
if not stack:
return None
return stack.pop()""",
"tests": [
{"input": ([1, 2, 3],), "expected": 3},
{"input": ([5],), "expected": 5},
{"input": ([],), "expected": None},
],
"hint": "Popping from an empty list raises IndexError."
},
{
"id": "bug_038",
"name": "Dictionary key missing raises error",
"category": "edge_case",
"difficulty": "hard",
"buggy_code": """def get_grade(grades, student):
return grades[student]""",
"correct_code": """def get_grade(grades, student):
return grades.get(student, None)""",
"tests": [
{"input": ({"Alice": 90, "Bob": 85}, "Alice"), "expected": 90},
{"input": ({"Alice": 90, "Bob": 85}, "Bob"), "expected": 85},
{"input": ({"Alice": 90, "Bob": 85}, "Charlie"),"expected": None},
],
"hint": "Direct dict access raises KeyError. Use .get() instead."
},
{
"id": "bug_039",
"name": "Merge sorted lists skips elements",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def merge_sorted(a, b):
result = []
i = j = 0
while i < len(a) and j < len(b):
if a[i] < b[j]:
result.append(a[i])
i += 1
else:
result.append(b[j])
j += 1
return result""",
"correct_code": """def merge_sorted(a, b):
result = []
i = j = 0
while i < len(a) and j < len(b):
if a[i] < b[j]:
result.append(a[i])
i += 1
else:
result.append(b[j])
j += 1
result.extend(a[i:])
result.extend(b[j:])
return result""",
"tests": [
{"input": ([1, 3, 5], [2, 4, 6]), "expected": [1, 2, 3, 4, 5, 6]},
{"input": ([1, 2], [3, 4]), "expected": [1, 2, 3, 4]},
{"input": ([], [1, 2]), "expected": [1, 2]},
],
"hint": "Remaining elements after the loop are never added."
},
{
"id": "bug_040",
"name": "Capitalize only first letter broken",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def capitalize_words(s):
return s.title().lower()""",
"correct_code": """def capitalize_words(s):
return s.title()""",
"tests": [
{"input": ("hello world",), "expected": "Hello World"},
{"input": ("python is fun",), "expected": "Python Is Fun"},
{"input": ("a b c",), "expected": "A B C"},
],
"hint": "Something is undoing the capitalization after it's applied."
},
{
"id": "bug_041",
"name": "GCD uses subtraction instead of modulo",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def gcd(a, b):
while b:
a = b
b = a - b
return a""",
"correct_code": """def gcd(a, b):
while b:
a, b = b, a % b
return a""",
"tests": [
{"input": (48, 18), "expected": 6},
{"input": (100, 75),"expected": 25},
{"input": (7, 3), "expected": 1},
{"input": (12, 4), "expected": 4},
],
"hint": "GCD uses the modulo operation, not subtraction. Also watch the variable update order."
},
{
"id": "bug_042",
"name": "Anagram check ignores spaces",
"category": "logic",
"difficulty": "hard",
"buggy_code": """def is_anagram(s1, s2):
return sorted(s1) == sorted(s2)""",
"correct_code": """def is_anagram(s1, s2):
s1 = s1.replace(" ", "").lower()
s2 = s2.replace(" ", "").lower()
return sorted(s1) == sorted(s2)""",
"tests": [
{"input": ("listen", "silent"), "expected": True},
{"input": ("hello", "world"), "expected": False},
{"input": ("Astronomer", "Moon starer"), "expected": True},
{"input": ("abc", "cab"), "expected": True},
],
"hint": "Spaces and case differences are not being handled."
},
]
def get_bug_by_id(bug_id: str):
for bug in BUGS:
if bug["id"] == bug_id:
return bug
return None
def get_bugs_by_difficulty(difficulty: str):
return [b for b in BUGS if b["difficulty"] == difficulty]
def get_all_ids():
return [b["id"] for b in BUGS]