bohdan

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 an alphametics puzzle in the format "A + B == C"
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
23 if len(parts) != 2:
24 return None
25
26 left_side, right_side = parts[0], parts[1]
27
28 # Extract all words (addends and result)
29 addends = left_side.split("+")
30 result = right_side
31
32 # Edge Case: No addends
33 if not addends or not result:
34 return None
35
36 # Get all unique letters
37 letters = set()
38 for word in addends + [result]:
39 letters.update(word)
40
41 # Edge Case: More than 10 unique letters (impossible to assign unique digits)
42 if len(letters) > 10:
43 return None
44
45 # Get first letters (can't be zero)
46 first_letters = {word[0] for word in addends + [result]}
47
48 # Convert letters to list for indexing
49 letters_list = list(letters)
50
51 # Try all permutations of digits for letters
52 from itertools import permutations
53
54 # Edge Case: Handle puzzles with no letters
55 if not letters_list:
56 return None
57
58 for perm in permutations(range(10), len(letters_list)):
59 # Create mapping
60 mapping = dict(zip(letters_list, perm))
61
62 # Check if any first letter is assigned zero
63 if any(mapping[letter] == 0 for letter in first_letters):
64 continue
65
66 # Convert words to numbers
67 try:
68 addend_values = []
69 for word in addends:
70 value = 0
71 for letter in word:
72 value = value * 10 + mapping[letter]
73 addend_values.append(value)
74
75 result_value = 0
76 for letter in result:
77 result_value = result_value * 10 + mapping[letter]
78
79 # Check if equation is satisfied
80 if sum(addend_values) == result_value:
81 return mapping
82 except KeyError:
83 # This shouldn't happen with proper permutation, but just in case
84 continue
85
86 # Edge Case: No solution found
87 return None
88
89# Handled Edge Cases: Empty or None puzzle, Invalid puzzle format, No addends, More than 10 unique letters, No letters, 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.