Just for fun:-) On my ooold PC, it takes 0.047 seconds to run the following algorithm on the problem 'SNED + MORE == MONEY".
----------------------------- import time import itertools #S, E, N, D, M, O, R, Y n = 0 digits = {x for x in range(10)} def tenThousand(u, Cin): # Cin == M global n if Cin == M: print(S, E, N, D, '+', M, O, R, E, '==', M, O, N, E, Y) n += 1 def thousand(u, Cin): # Cin + S + M == 10 * Cout + O global S, M, n rest = digits - set(u) for g in itertools.permutations(rest, 2): for Cout in range(2): if Cin + g[0] + g[1] == 10 * Cout + O: S = g[0]; M = g[1] tenThousand(u + g, Cout) def hundred(u, Cin): # Cin + E + O == 10 * Cout + N global O, n rest = digits - set(u) for g in itertools.permutations(rest, 1): for Cout in range(2): if Cin + E + g[0] == 10 * Cout + N: O = g[0] thousand(u + g, Cout) def ten(u, Cin): # Cin + N + R == 10 * Cout + E global N, R, n rest = digits - set(u) for g in itertools.permutations(rest, 2): for Cout in range(2): if Cin + g[0] + g[1] == 10 * Cout + E: N = g[0]; R = g[1] hundred(u + g, Cout) def unit(): # D + E == 10 * Cout + Y global D, E, Y, n n = 0 for g in itertools.permutations(range(10), 3): # g is a tuple for Cout in range(2): # add two items so Cout is 0 or 1 if g[0] + g[1] == 10 * Cout + g[2]: D = g[0]; E = g[1]; Y = g[2] ten(g, Cout) print(n) if __name__ == '__main__': start = time.time() unit() print(time.time() - start) ------------------------- --Jach -- https://mail.python.org/mailman/listinfo/python-list