forked from exercism/python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.py
More file actions
29 lines (19 loc) · 863 Bytes
/
example.py
File metadata and controls
29 lines (19 loc) · 863 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from itertools import combinations, permutations
def check_leading_zeros(*numbers):
return any(n[0] == '0' for n in numbers)
def test_equation(puzzle, substitutions):
equation = ''.join(substitutions.get(char) or char for char in puzzle)
left, right = equation.split(' == ')
left_numbers = left.split(' + ')
if check_leading_zeros(right, *left_numbers):
return False
return sum(map(int, left_numbers)) == int(right)
def solve(puzzle):
letters = set(char for char in puzzle if char.isupper())
numbers = map(str, range(10))
for c in combinations(numbers, len(letters)):
for p in permutations(c):
substitutions = dict(zip(letters, p))
if test_equation(puzzle, substitutions):
return {k: int(v) for k, v in substitutions.items()}
return {} # no solution found