couple

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 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 (no equals sign or too many parts)
23 if len(parts) != 2:
24 return None
25
26 right_side = parts[1]
27 left_parts = parts[0].replace("+", " ").split()
28
29 # Edge Case: No terms on the left side
30 if not left_parts:
31 return None
32
33 # Extract all unique letters
34 letters = set()
35 for part in left_parts + [right_side]:
36 letters.update(part)
37
38 # Edge Case: No letters in puzzle
39 if not letters:
40 return None
41
42 # Extract first letters (can't be zero)
43 first_letters = {word[0] for word in left_parts + [right_side]}
44
45 letters = list(letters)
46 n = len(letters)
47
48 # Edge Case: More than 10 unique letters (impossible to assign unique digits)
49 if n > 10:
50 return None
51
52 # Create a mapping from letters to indices
53 letter_to_index = {letter: i for i, letter in enumerate(letters)}
54
55 # Convert words to lists of indices
56 left_indices = []
57 for word in left_parts:
58 left_indices.append([letter_to_index[letter] for letter in word])
59
60 right_indices = [letter_to_index[letter] for letter in right_side]
61
62 # Generate all possible digit assignments
63 from itertools import permutations
64
65 # Try all permutations of digits for the letters
66 for perm in permutations(range(10), n):
67 # Edge Case: Leading zero in any number
68 if any(perm[letter_to_index[letter]] == 0 for letter in first_letters):
69 continue
70
71 # Calculate left side sum
72 left_sum = 0
73 for word_indices in left_indices:
74 number = 0
75 for idx in word_indices:
76 number = number * 10 + perm[idx]
77 left_sum += number
78
79 # Calculate right side value
80 right_value = 0
81 for idx in right_indices:
82 right_value = right_value * 10 + perm[idx]
83
84 # Check if equation is satisfied
85 if left_sum == right_value:
86 # Return the solution as a dictionary
87 return {letter: perm[letter_to_index[letter]] for letter in letters}
88
89 # Edge Case: No valid solution found
90 return None
91
92# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, No terms on left side, No letters 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.