perfect

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 alphametics puzzle (e.g., "SEND + MORE == MONEY")
7
8 Returns:
9 A dictionary mapping letters to digits that solves the puzzle, or None if no solution exists.
10
11 The function handles the following edge cases:
12 - Invalid puzzle format
13 - Leading zeros in numbers
14 - Duplicate letter assignments
15 - No solution found
16 """
17 # Edge Case: Empty or None puzzle
18 if not puzzle:
19 return None
20
21 # Parse the puzzle
22 # Edge Case: Invalid puzzle format (no '=' or incorrect structure)
23 if '=' not in puzzle:
24 return None
25
26 try:
27 # Handle both "=" and "==" operators
28 if ' == ' in puzzle:
29 left_side, right_side = puzzle.split(' == ')
30 elif ' = ' in puzzle:
31 left_side, right_side = puzzle.split(' = ')
32 else:
33 # Handle cases without spaces around =
34 parts = puzzle.split('=')
35 if len(parts) != 2:
36 return None
37 left_side, right_side = parts[0], parts[1]
38
39 addends = [word.strip() for word in left_side.split('+')]
40 result = right_side.strip()
41 except ValueError:
42 return None
43
44 # Edge Case: Empty words in puzzle
45 if not all(addends) or not result:
46 return None
47
48 # Get all unique letters
49 letters = set()
50 for word in addends + [result]:
51 letters.update(word)
52
53 # Edge Case: More than 10 unique letters (impossible to assign unique digits)
54 if len(letters) > 10:
55 return None
56
57 # Get first letters (can't be zero)
58 first_letters = {word[0] for word in addends + [result]}
59
60 # Convert to sorted list for consistent ordering
61 letters = list(letters)
62
63 # Try all possible digit assignments
64 from itertools import permutations
65
66 # Edge Case: Handle puzzles with no letters
67 if not letters:
68 return {}
69
70 # Try all permutations of digits for the letters
71 for perm in permutations(range(10), len(letters)):
72 mapping = dict(zip(letters, perm))
73
74 # Check if any first letter is assigned zero
75 # Edge Case: Leading zero in any number
76 if any(mapping[letter] == 0 for letter in first_letters):
77 continue
78
79 # Calculate the sum of addends
80 addend_values = []
81 for word in addends:
82 value = 0
83 for letter in word:
84 value = value * 10 + mapping[letter]
85 addend_values.append(value)
86
87 # Calculate the result value
88 result_value = 0
89 for letter in result:
90 result_value = result_value * 10 + mapping[letter]
91
92 # Check if the equation is satisfied
93 if sum(addend_values) == result_value:
94 return mapping
95
96 # Edge Case: No valid solution found
97 return None
98
99# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, Empty words 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.