great

Finished
11def solve(puzzle: str) -> dict[str, int] | None:
2 pass
2 """
3 Solve an alphametics puzzle.
4
5 Args:
6 puzzle (str): A string representing the alphametics puzzle (e.g., "SEND + MORE == MONEY")
7
8 Returns:
9 dict[str, int] | None: A dictionary mapping letters to digits that solves the puzzle,
10 or None if no solution exists
11
12 Example:
13 >>> solve("SEND + MORE == MONEY")
14 {'S': 9, 'E': 5, 'N': 6, 'D': 7, 'M': 1, 'O': 0, 'R': 8, 'Y': 2}
15 """
16 # Edge Case: Empty or None puzzle
17 if not puzzle:
18 return None
19
20 # Parse the puzzle
21 parts = puzzle.replace("==", "=").replace(" ", "").split("=")
22
23 # Edge Case: Invalid puzzle format (no equals sign or too many parts)
24 if len(parts) != 2:
25 return None
26
27 right_side = parts[1]
28 left_parts = parts[0].replace("+", " ").split()
29
30 # Edge Case: No terms on the left side
31 if not left_parts:
32 return None
33
34 # Extract all unique letters
35 letters = set()
36 for part in left_parts + [right_side]:
37 letters.update(part)
38
39 # Edge Case: No letters in puzzle
40 if not letters:
41 return None
42
43 # Extract first letters (can't be zero)
44 first_letters = {word[0] for word in left_parts + [right_side]}
45
46 # Convert to sorted list for consistent ordering
47 letters = list(letters)
48
49 # Edge Case: More than 10 unique letters (impossible to solve)
50 if len(letters) > 10:
51 return None
52
53 # Try all possible digit assignments
54 from itertools import permutations
55
56 # Try all permutations of digits for the letters
57 for perm in permutations(range(10), len(letters)):
58 mapping = dict(zip(letters, perm))
59
60 # Edge Case: Leading zero in any number
61 if any(mapping[first] == 0 for first in first_letters):
62 continue
63
64 # Calculate left side sum
65 left_sum = 0
66 for word in left_parts:
67 num = 0
68 for char in word:
69 num = num * 10 + mapping[char]
70 left_sum += num
71
72 # Calculate right side value
73 right_num = 0
74 for char in right_side:
75 right_num = right_num * 10 + mapping[char]
76
77 # Check if equation is satisfied
78 if left_sum == right_num:
79 return mapping
80
81 # Edge Case: No valid solution found
82 return None
83
84# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, No terms on left side, No letters in puzzle, More than 10 unique letters, Leading zero in any number, No valid solution found
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.