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 puzzle (e.g., "SEND + MORE == MONEY")
7
8 Returns:
9 A dictionary mapping letters to digits, or None if no solution exists
10 """
11 # Edge Case: Empty or None puzzle
12 if not puzzle:
13 return None
14
15 # Parse the puzzle
16 parts = puzzle.replace("==", "=").replace(" ", "").split("=")
17
18 # Edge Case: Invalid puzzle format
19 if len(parts) != 2:
20 return None
21
22 right_side = parts[1]
23 left_expression = parts[0]
24
25 # Extract operator and operands
26 operators = []
27 operands = []
28 current_operand = ""
29
30 for char in left_expression:
31 if char in "+-*":
32 operators.append(char)
33 operands.append(current_operand)
34 current_operand = ""
35 else:
36 current_operand += char
37 operands.append(current_operand)
38
39 # Edge Case: No operands
40 if not operands or any(not op for op in operands):
41 return None
42
43 left_sides = operands
44
45 # Edge Case: No terms on the left side
46 if not left_sides:
47 return None
48
49 # Get all unique letters
50 letters = set()
51 for part in left_sides + [right_side]:
52 letters.update(part)
53
54 # Edge Case: No letters in puzzle
55 if not letters:
56 return None
57
58 # Get first letters (can't be zero)
59 first_letters = {word[0] for word in left_sides + [right_side]}
60
61 # Edge Case: More than 10 unique letters (impossible to solve)
62 if len(letters) > 10:
63 return None
64
65 letters = list(letters)
66
67 # Try all possible digit assignments
68 from itertools import permutations
69
70 for perm in permutations(range(10), len(letters)):
71 mapping = dict(zip(letters, perm))
72
73 # Edge Case: Leading zero
74 if any(mapping[letter] == 0 for letter in first_letters):
75 continue
76
77 # Calculate left side value with proper operator handling
78 numbers = []
79 for word in left_sides:
80 number = 0
81 for letter in word:
82 number = number * 10 + mapping[letter]
83 numbers.append(number)
84
85 # Apply operators in sequence
86 if not operators:
87 left_value = numbers[0] if numbers else 0
88 else:
89 left_value = numbers[0]
90 for i, op in enumerate(operators):
91 if op == "+":
92 left_value += numbers[i + 1]
93 elif op == "-":
94 left_value -= numbers[i + 1]
95 elif op == "*":
96 left_value *= numbers[i + 1]
97
98 # Calculate right side value
99 right_value = 0
100 for letter in right_side:
101 right_value = right_value * 10 + mapping[letter]
102
103 # Check if equation is satisfied
104 if left_value == right_value:
105 return mapping
106
107 # Edge Case: No solution found
108 return None
109# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, No terms on the left side, No letters in puzzle, More than 10 unique letters (impossible to solve), Leading zero, 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.