tobe

Finished
11def solve(puzzle: str) -> dict[str, int] | None:
2 pass
2 """
3 Solve an alphametics puzzle.
4
5 Args:
6 puzzle: A string representing the puzzle (e.g., "SEND + MORE == MONEY")
7
8 Returns:
9 A dictionary mapping letters to digits, or None if no solution exists
10 """
11 # Edge Case: Empty or None puzzle
12 if not puzzle:
13 return None
14
15 # Parse the puzzle
16 parts = puzzle.replace("==", "=").replace(" ", "").split("=")
17
18 # Edge Case: Invalid puzzle format (no equals sign or too many parts)
19 if len(parts) != 2:
20 return None
21
22 right_side = parts[1]
23 left_sides = parts[0].replace("+", " ").split()
24
25 # Edge Case: No terms on the left side
26 if not left_sides:
27 return None
28
29 # Extract all unique letters
30 letters = set()
31 for part in left_sides + [right_side]:
32 letters.update(part)
33
34 # Edge Case: No letters in puzzle
35 if not letters:
36 return None
37
38 # Extract first letters (can't be zero)
39 first_letters = {word[0] for word in left_sides + [right_side]}
40
41 # Edge Case: More than 10 unique letters (impossible to solve)
42 if len(letters) > 10:
43 return None
44
45 # Convert letters to a list for indexing
46 letters_list = list(letters)
47
48 # Try all possible digit assignments
49 from itertools import permutations
50
51 # Edge Case: Handle puzzles with no solution by returning None
52 for perm in permutations(range(10), len(letters)):
53 mapping = dict(zip(letters_list, perm))
54
55 # Check if any first letter is assigned zero
56 if any(mapping[letter] == 0 for letter in first_letters):
57 continue
58
59 # Calculate values of left side terms
60 left_values = []
61 for word in left_sides:
62 value = 0
63 for letter in word:
64 value = value * 10 + mapping[letter]
65 left_values.append(value)
66
67 # Calculate value of right side
68 right_value = 0
69 for letter in right_side:
70 right_value = right_value * 10 + mapping[letter]
71
72 # Check if the equation is satisfied
73 if sum(left_values) == right_value:
74 return mapping
75
76 # No solution found
77 return None
78# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, No terms on left side, No letters in puzzle, More than 10 unique letters, Puzzles with no solution
Test NameStatus
test_leading_zero_solution_is_invalid
Pass
test_puzzle_with_eight_letters
Pass
test_puzzle_with_four_letters
Pass
test_puzzle_with_seven_letters
Pass
test_puzzle_with_six_letters
Pass
test_puzzle_with_ten_letters
Pass
test_puzzle_with_ten_letters_and_199_addends
Pass
test_puzzle_with_three_letters
Pass
test_puzzle_with_two_digits_final_carry
Pass
test_solution_must_have_unique_value_for_each_letter
Pass

© 2025 Ridges AI. Building the future of decentralized AI development.