uv

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 uses backtracking with constraint propagation to find a valid digit assignment
12 where each letter represents a unique digit, no leading digit is zero, and the equation holds.
13
14 Edge Cases Handled:
15 - Invalid puzzle format (no '==')
16 - Empty puzzle
17 - Words with no letters
18 - Single word equations
19 - Leading zeros in results
20 """
21 # Edge Case: Empty puzzle
22 if not puzzle:
23 return None
24
25 # Parse the puzzle
26 # Edge Case: Invalid puzzle format (no '==')
27 if "==" not in puzzle:
28 return None
29
30 left_side, right_side = puzzle.split("==")
31 left_words = [word.strip() for word in left_side.split("+")]
32 right_word = right_side.strip()
33
34 # Edge Case: No words in equation
35 if not left_words or not right_word:
36 return None
37
38 # Extract all unique letters
39 letters = set()
40 for word in left_words + [right_word]:
41 letters.update(word)
42
43 # Edge Case: No letters in puzzle
44 if not letters:
45 return None
46
47 # Identify first letters (can't be zero)
48 first_letters = {word[0] for word in left_words + [right_word]}
49
50 # Convert to lists for indexing
51 letters = list(letters)
52
53 def evaluate(assignment):
54 """Evaluate if current assignment satisfies the equation"""
55 # Edge Case: Not all letters assigned
56 for letter in letters:
57 if letter not in assignment:
58 return False
59
60 left_sum = 0
61 for word in left_words:
62 # Edge Case: Empty word
63 if not word:
64 continue
65 num = 0
66 for char in word:
67 # Edge Case: Character not in assignment (should not happen in valid paths)
68 if char not in assignment:
69 return False
70 num = num * 10 + assignment[char]
71 left_sum += num
72
73 right_num = 0
74 for char in right_word:
75 # Edge Case: Character not in assignment (should not happen in valid paths)
76 if char not in assignment:
77 return False
78 right_num = right_num * 10 + assignment[char]
79
80 return left_sum == right_num
81
82 def is_valid_partial(assignment):
83 """Check if partial assignment could lead to valid solution"""
84 # Check leading zeros
85 for letter in first_letters:
86 if letter in assignment and assignment[letter] == 0:
87 return False
88
89 # Check for duplicate digits
90 used_digits = set(assignment.values())
91 if len(used_digits) != len(assignment):
92 return False
93
94 return True
95
96 def backtrack(assignment):
97 """Backtracking search for solution"""
98 # If we've assigned all letters, check if it's a solution
99 if len(assignment) == len(letters):
100 if evaluate(assignment):
101 return assignment.copy()
102 return None
103
104 # Choose next unassigned letter
105 for letter in letters:
106 if letter not in assignment:
107 break
108
109 # Try each digit for this letter
110 for digit in range(10):
111 # Make assignment
112 assignment[letter] = digit
113
114 # If partial assignment is valid, continue
115 if is_valid_partial(assignment):
116 result = backtrack(assignment)
117 if result is not None:
118 return result
119
120 # Backtrack
121 del assignment[letter]
122
123 return None
124
125 # Start backtracking with empty assignment
126 solution = backtrack({})
127 return solution
128
129# Handled Edge Cases: Empty puzzle, invalid format, no words, no letters, empty words,
130# characters not in assignment, leading zeros, duplicate digits
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.