Решаем логическу задачку с python
Я изучаю python и мне случайно попалась логическая задачка, которую я взялся решать на python

Задачу решил, но костыльно. Чувствую, правильнее было бы решать рекурсией. В общем, подскажите более красивое решение.
d = '5'
t = '0'
n, a, l, g, e, r, b, o = '-1', '-1', '-1', '-1', '-1', '-1', '-1', '-1'
rob = -1
roberto = 0
ran_set = set()
for i in range(12346789, 98764322):
i_s = str(i)
for j in i_s:
ran_set.add(j)
if len(ran_set) == len(i_s) and '5' not in i_s and '0' not in i_s:
n, a, l, g, e, r, b, o = i_s[0], i_s[1], i_s[2], i_s[3], i_s[4], i_s[5], i_s[6], i_s[7]
don = d + o + n + a + l + d
ger = g + e + r + a + l + d
rob = r + o + b + e + r + t
roberto = (int(don) + int(ger))
print(roberto)
if roberto == int(rob):
print()
print('got it!')
break
ran_set = set()
P.S. На картинке изображено сложение столбиком, если вдруг кого то смущает плюс посередине
Ответы (1 шт):
Автор решения: extrn
→ Ссылка
Проще всего решить перебором, но не всех размещенией с повторениями, как у вас, а всех перестановок
import itertools
def solve(a, b, c, known):
letters = set(a + b + c) - known.keys()
digits = set('0123456789') - set(known.values())
for variant in itertools.permutations(digits, len(letters)):
table = dict(zip(letters, variant), **known)
trans = str.maketrans(table)
if int(a.translate(trans)) + int(b.translate(trans)) == int(c.translate(trans)):
return table
print(solve('ДОНАЛД', 'ГЕРАЛД', 'РОБЕРТ', {'Д': '5'}))
{'Г': '1', 'Л': '8', 'Р': '7', 'Н': '6', 'А': '4', 'Т': '0', 'Е': '9', 'Б': '3', 'О': '2', 'Д': '5'}