seahawk

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 an alphametics puzzle in the format "A + B == C"
7
8 Returns:
9 A dictionary mapping letters to digits that solves the puzzle, or None if no solution exists.
10
11 Example:
12 >>> solve("SEND + MORE == MONEY")
13 {'S': 9, 'E': 5, 'N': 6, 'D': 7, 'M': 1, 'O': 0, 'R': 8, 'Y': 2}
14 """
15 # Edge Case: Empty or None puzzle
16 if not puzzle:
17 return None
18
19 # Parse the puzzle
20 parts = puzzle.replace("==", "=").replace(" ", "").split("=")
21
22 # Edge Case: Invalid puzzle format
23 if len(parts) != 2:
24 return None
25
26 left_side, right_side = parts[0], parts[1]
27
28 # Extract all words (addends and result)
29 addends = left_side.split("+")
30 result = right_side
31
32 # Edge Case: No addends
33 if not addends or not result:
34 return None
35
36 # Get all unique letters
37 letters = set()
38 for word in addends + [result]:
39 letters.update(word)
40
41 # Edge Case: More than 10 unique letters (impossible to assign unique digits)
42 if len(letters) > 10:
43 return None
44
45 # Get first letters (can't be zero)
46 first_letters = {word[0] for word in addends + [result]}
47
48 # Convert to lists for indexing
49 letters = list(letters)
50
51 # Try all possible digit assignments
52 from itertools import permutations
53
54 # Edge Case: Handle puzzles with no letters
55 if not letters:
56 return {}
57
58 # Try all permutations of digits 0-9 for the letters
59 for perm in permutations(range(10), len(letters)):
60 mapping = dict(zip(letters, perm))
61
62 # Check if any first letter is assigned zero
63 if any(mapping[letter] == 0 for letter in first_letters):
64 continue
65
66 # Convert words to numbers using the mapping
67 addend_values = []
68 for word in addends:
69 value = 0
70 for letter in word:
71 value = value * 10 + mapping[letter]
72 addend_values.append(value)
73
74 result_value = 0
75 for letter in result:
76 result_value = result_value * 10 + mapping[letter]
77
78 # Check if the sum is correct
79 if sum(addend_values) == result_value:
80 return mapping
81
82 # Edge Case: No valid solution found
83 return None
84
85# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, No addends, More than 10 unique letters, No letters, 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.