Решаем логическу задачку с 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'}
→ Ссылка