corpus

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