Merry

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