| 1 | 1 | def solve(puzzle: str) -> dict[str, int] | None: |
| 2 | | pass |
| 2 | # Edge Case: Empty puzzle string |
| 3 | if not puzzle: |
| 4 | return None |
| 5 | |
| 6 | # Parse the puzzle |
| 7 | parts = puzzle.replace('==', '=').replace(' ', '').split('=') |
| 8 | |
| 9 | # Edge Case: Invalid puzzle format (no equals sign or too many parts) |
| 10 | if len(parts) != 2: |
| 11 | return None |
| 12 | |
| 13 | right_side = parts[1] |
| 14 | left_sides = parts[0].replace('+', ' ').split() |
| 15 | |
| 16 | # Edge Case: No addends on the left side |
| 17 | if not left_sides: |
| 18 | return None |
| 19 | |
| 20 | # Get all unique letters |
| 21 | letters = set(''.join(left_sides) + right_side) |
| 22 | |
| 23 | # Edge Case: More than 10 unique letters (impossible to assign unique digits) |
| 24 | if len(letters) > 10: |
| 25 | return None |
| 26 | |
| 27 | # Get leading letters (first letter of each word) |
| 28 | leading_letters = {word[0] for word in left_sides + [right_side]} |
| 29 | |
| 30 | # Edge Case: Leading letters cannot be zero |
| 31 | # This is handled in the permutation generation below |
| 32 | |
| 33 | # Convert words to lists of characters for easier processing |
| 34 | left_words = [list(word) for word in left_sides] |
| 35 | right_word = list(right_side) |
| 36 | |
| 37 | # Generate all possible digit assignments |
| 38 | from itertools import permutations |
| 39 | |
| 40 | # Try all permutations of digits for the unique letters |
| 41 | for perm in permutations(range(10), len(letters)): |
| 42 | mapping = dict(zip(letters, perm)) |
| 43 | |
| 44 | # Edge Case: Leading digits cannot be zero |
| 45 | if any(mapping[letter] == 0 for letter in leading_letters): |
| 46 | continue |
| 47 | |
| 48 | # Calculate the sum of left side numbers |
| 49 | left_sum = 0 |
| 50 | valid = True |
| 51 | |
| 52 | for word in left_words: |
| 53 | num = 0 |
| 54 | for char in word: |
| 55 | num = num * 10 + mapping[char] |
| 56 | left_sum += num |
| 57 | |
| 58 | # Calculate the right side number |
| 59 | right_num = 0 |
| 60 | for char in right_word: |
| 61 | right_num = right_num * 10 + mapping[char] |
| 62 | |
| 63 | # Check if the equation is satisfied |
| 64 | if left_sum == right_num: |
| 65 | return mapping |
| 66 | |
| 67 | # Edge Case: No valid solution found |
| 68 | return None |
| 69 | # Handled Edge Cases: Empty puzzle string, Invalid puzzle format, No addends on left side, More than 10 unique letters, Leading digits cannot be zero, No valid solution found |