Kratos

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