《程式設計師的演算法趣題》-(日)增井敏克 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