Dive into Python 第八章的例子
解决一个问题:
HAWAII + IDAHO + IOWA + OHIO == STATES
510199 + 98153 + 9301 + 3593 == 621246
H = 5
A = 1
W = 0
I = 9
D = 8
O = 3
S = 6
T = 2
E = 4
书中的算法:
import re
import itertools
def solve(puzzle):
words = re.findall('[A-Z]+', puzzle.upper())
unique_characters = set(''.join(words))
assert len(unique_characters) <= 10, 'Too many letters'
first_letters = {word[0] for word in words}
n = len(first_letters)
sorted_characters = ''.join(first_letters) + \
''.join(unique_characters - first_letters)
characters = tuple(ord(c) for c in sorted_characters)
digits = tuple(ord(c) for c in '0123456789')
zero = digits[0]
for guess in itertools.permutations(digits, len(characters)):
if zero not in guess[:n]:
equation = puzzle.translate(dict(zip(characters, guess)))
if eval(equation):
return equation
if __name__ == '__main__':
import sys
for puzzle in sys.argv[1:]:
print(puzzle)
solution = solve(puzzle)
if solution:
print(solution)
我写的算法:
'use strict';
console.time('H,A,W,I,D,O,S,T,E');
const 满足等式=(H,A,W,I,D,O,S,T,E)=>
H*100110+A*9201+W*1010+I*11021+D*1000+O*1102===S*100001+T*10100+E*10;
const 无一重复=(H_A_W_I_D_O_S_T_E)=>
new Set(...H_A_W_I_D_O_S_T_E).size===H_A_W_I_D_O_S_T_E.length;
const 数字范围=1000000000;
for(let 数字答案=数字范围;数字答案--;){
const 字串答案=(数字范围+数字答案).toString().slice(1);
if(满足等式(...字串答案)&&无一重复(字串答案)){
console.log(字串答案.split('').join(','));
break;
}
}
console.timeEnd('H,A,W,I,D,O,S,T,E');
10 分钟是在 Node.js 8.3 中进行的测试;Chrome 要 15 分钟。
这究竟是算法的差异,还是语言的差异?我的电脑 CPU 是 E3 1230 v5 (3.4GHz)。