A straightforward translation of the first program to Python 3 runs in 11 seconds:
digits = set(range(10))
def choose(choices, fn):
for value in choices:
fn(value)
def guard(condition, fn):
if condition:
fn()
def ten(*digits):
return int(''.join(map(str, digits)))
choose(digits - {0}, lambda s:
choose(digits - {s}, lambda e:
choose(digits - {s, e}, lambda n:
choose(digits - {s, e, n}, lambda d:
choose(digits - {0, s, e, n, d}, lambda m:
choose(digits - {s, e, n, d, m}, lambda o:
choose(digits - {s, e, n, d, m, o}, lambda r:
choose(digits - {s, e, n, d, m, o, r}, lambda y:
(lambda
send = ten(s, e, n, d),
more = ten(m, o, r, e),
money = ten(m, o, n, e, y):
guard(send + more == money, lambda:
print("{} + {} = {}".format(send, more, money))
))()))))))))