import itertools


def calc_word_value(reversed_word, symbol_map):
    result = 0
    for letter, factor in reversed_word:
        result += symbol_map[letter] * factor
    return result

def print_result(words, answer, variant):
    t_words = []
    for word in words:
        t_words.append("".join(str(variant[l]) for l in word))
    
    t_answer = "".join(str(variant[l]) for l in answer)

    print("{:15s} {} = {}".format("INPUT:", " + ".join(words), answer))
    print("{:15s} {} = {}".format("SOLUTION:", " + ".join(t_words), t_answer))
    print("")


def solver(puzzle, full_search=False):
    words_line, answer = puzzle.split('=')
    words = [word.strip() for word in words_line.split('+')]
    answer = answer.strip()
    all_words = words + [answer]

    # 'abcd' --> [('d', 1), ('c', 10), ('b', 100), ('a', 1000)]
    rev_words = []
    for word in words:
        rev_word = [(letter, 10**num) for num, letter in enumerate(word[::-1])]
        rev_words.append(rev_word)
    rev_answer = [(letter, 10**num) for num, letter in enumerate(answer[::-1])]

    letters = sorted(set("".join(all_words)))
    LEN = len(letters)

    for digits_selection in itertools.combinations(range(10), len(letters)):
        for digits_permutation in itertools.permutations(digits_selection):
            # make dict: letter --> digit (int)
            variant = dict(zip(letters, digits_permutation))
            is_allowed = True
            for word in all_words:
                if variant[word[0]] == 0:
                    is_allowed = False

            if is_allowed:
                words_sum = 0
                for rev_word in rev_words:
                    words_sum += calc_word_value(rev_word, variant)

                answer_sum = calc_word_value(rev_answer, variant)
                if words_sum == answer_sum:
                    print_result(words, answer, variant)
                    if not full_search:
                        return


full_search = False

solver("send + more = money", full_search=full_search)
solver("ZEROES + ONES = BINARY", full_search=full_search)
solver("COUPLE + COUPLE = QUARTET", full_search=full_search)
solver("DO + YOU + FEEL = LUCKY", full_search=full_search)
solver("ELEVEN + NINE + FIVE + FIVE = THIRTY", full_search=full_search)