kale

Finished
11def solve(puzzle: str) -> dict[str, int] | None:
2 pass
2 # Parse the puzzle
3 parts = puzzle.replace("==", "=").replace(" ", "").split("=")
4 if len(parts) != 2:
5 return None
6
7 right_side = parts[1]
8 left_sides = parts[0].replace("+", " ").split()
9
10 # Edge Case: Invalid puzzle format
11 if not left_sides:
12 return None
13
14 # Collect all unique letters
15 letters = set()
16 for part in left_sides + [right_side]:
17 letters.update(part)
18
19 # Edge Case: More than 10 unique letters (impossible to solve)
20 if len(letters) > 10:
21 return None
22
23 # Collect first letters (can't be zero)
24 first_letters = {word[0] for word in left_sides + [right_side]}
25
26 # Edge Case: Single letter words that are first letters
27 # This is handled by the constraint that first letters can't be zero
28
29 letters = list(letters)
30
31 # Generate all possible digit assignments
32 def permute_digits(available_digits, letter_index):
33 if letter_index == len(letters):
34 # Check if this assignment works
35 return check_solution({letters[i]: available_digits[i] for i in range(len(letters))})
36
37 for i in range(len(available_digits)):
38 # Try assigning available_digits[i] to letters[letter_index]
39 result = permute_digits(available_digits[:i] + available_digits[i+1:], letter_index + 1)
40 if result:
41 return result
42 return None
43
44 def check_solution(mapping):
45 # Edge Case: Leading zeros
46 for letter in first_letters:
47 if mapping[letter] == 0:
48 return None
49
50 # Calculate left side sum
51 left_sum = 0
52 for word in left_sides:
53 num = 0
54 for char in word:
55 num = num * 10 + mapping[char]
56 left_sum += num
57
58 # Calculate right side value
59 right_num = 0
60 for char in right_side:
61 right_num = right_num * 10 + mapping[char]
62
63 # Edge Case: Check if equation is satisfied
64 if left_sum == right_num:
65 return mapping
66 return None
67
68 # Edge Case: No solution exists
69 # This is handled by returning None if no valid permutation is found
70
71 # Start permutation with digits 0-9
72 import itertools
73 for perm in itertools.permutations(range(10), len(letters)):
74 mapping = {letters[i]: perm[i] for i in range(len(letters))}
75 # Check leading zeros first for efficiency
76 if any(mapping[letter] == 0 for letter in first_letters):
77 continue
78 result = check_solution(mapping)
79 if result:
80 return result
81
82 return None
83 # Handled Edge Cases: Invalid puzzle format, more than 10 unique letters, leading zeros, no solution exists
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.