xas

Finished
1import itertools
2import re
3
14def solve(puzzle: str) -> dict[str, int] | None:
2 pass
5 """
6 Solve an alphametics puzzle.
7
8 Args:
9 puzzle (str): A string representing the alphametics puzzle (e.g., "SEND + MORE == MONEY")
10
11 Returns:
12 dict[str, int] | None: A dictionary mapping letters to digits that solves the puzzle,
13 or None if no solution exists.
14
15 Example:
16 >>> solve("SEND + MORE == MONEY")
17 {'S': 9, 'E': 5, 'N': 6, 'D': 7, 'M': 1, 'O': 0, 'R': 8, 'Y': 2}
18 """
19 # Parse the puzzle into components
20 # Edge Case: Invalid puzzle format
21 if "==" not in puzzle:
22 return None
23
24 left_side, right_side = puzzle.replace(" ", "").split("==")
25
26 # Edge Case: Empty sides in puzzle
27 if not left_side or not right_side:
28 return None
29
30 # Extract all words (addends and result)
31 addends = left_side.split("+")
32 result_word = right_side
33
34 # Edge Case: Empty addend
35 if any(not addend for addend in addends):
36 return None
37
38 # Edge Case: Empty result word
39 if not result_word:
40 return None
41
42 # Get all unique letters
43 all_words = addends + [result_word]
44 unique_letters = set("".join(all_words))
45
46 # Edge Case: More than 10 unique letters (impossible to assign unique digits)
47 if len(unique_letters) > 10:
48 return None
49
50 # Get first letters of each word (can't be zero)
51 first_letters = {word[0] for word in all_words}
52
53 # Edge Case: First letters contain non-alphabetic characters
54 if any(not letter.isalpha() for letter in first_letters):
55 return None
56
57 # Sort letters for consistent ordering
58 sorted_letters = sorted(unique_letters)
59
60 # Try all digit permutations for the unique letters
61 digits = range(10)
62 for perm in itertools.permutations(digits, len(unique_letters)):
63 # Create mapping from letters to digits
64 mapping = dict(zip(sorted_letters, perm))
65
66 # Edge Case: Leading zero in any word
67 if any(mapping[letter] == 0 for letter in first_letters):
68 continue
69
70 # Convert words to numbers using the mapping
71 try:
72 addend_values = []
73 for word in addends:
74 value = 0
75 for letter in word:
76 value = value * 10 + mapping[letter]
77 addend_values.append(value)
78
79 result_value = 0
80 for letter in result_word:
81 result_value = result_value * 10 + mapping[letter]
82 except KeyError:
83 # Edge Case: Non-alphabetic characters in words
84 continue
85
86 # Check if the sum is correct
87 if sum(addend_values) == result_value:
88 return mapping
89
90 # Edge Case: No valid solution found
91 return None
92
93# Handled Edge Cases: Invalid puzzle format, Empty sides in puzzle, Empty addend, Empty result word, More than 10 unique letters, First letters contain non-alphabetic characters, Leading zero in any word, Non-alphabetic characters in words, 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.