1. 程式人生 > >《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q13)

《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q13)

《程式設計師的演算法趣題》-(日)增井敏克 , 書中為69 道數學謎題編寫了解題程式, 程式語言為:Ruby,JavaScript,C語言。有興趣的同學,可以購書閱讀~

在此更新個人編寫的Python版,僅供學習使用。(執行環境:Python3.6)

Q13 有多少種滿足字母算式的解法

    所謂字母算式,就是用字母表示的算式,規則是相同字母對應相同數字,不同字母對應不同數字,並且第一位字母的對應數字不能是 0。
    譬如給定算式 We×love = CodeIQ,則可以對應填上下面這些數字以使之成立。
W = 7, e = 4, l = 3, o = 8, v = 0, C = 2, d = 1, I = 9, Q = 6
    這樣一來,我們就能得到 74×3804 = 281496 這樣的等式。使前面那個字母算式成立的解法只有這一種。

問題
    求使下面這個字母算式成立的解法有多少種?
            READ + WRITE + TALK = SKILL

import re

def calc(calc_string):
    re_res = re.search('[A-Z]', calc_string)
    if re_res is None:
        if eval(calc_string):
            result_equation_list.append(calc_string.replace("==", '='))
        return
    else:
        _character = re_res.group()
        for value in char_dict[_character]:
            if value not in calc_string:
                replaced_string = calc_string.replace(_character, value)
                calc(replaced_string)

char_equation = 'READ+WRITE+TALK==SKILL'

cal_number = re.findall('[A-Z]+', char_equation)
char_dict = {}
changed_equation = char_equation
for word in cal_number:
    for index, character in enumerate(word):
        if index == 0:
            char_dict[character] = [str(i) for i in range(1, 10)]
        elif character not in char_dict:
            char_dict[character] = [str(i) for i in range(10)]

result_equation_list = []
calc(char_equation)
print("結果共有%s種,分別是:\n%s" % (len(result_equation_list), '\n'.join(result_equation_list)))

 執行結果:

                 結果共有10種,分別是:
                1632+41976+7380=50988
                2543+72065+6491=81099
                4905+24689+8017=37611
                5094+75310+1962=82366
                5096+35710+1982=42788
                5180+65921+2843=73944
                5270+85132+3764=94166
                7092+37510+1986=46588
                7092+47310+1986=56388
                9728+19467+6205=35400