I'm solving the SEND + MORE = MONEY problem where SEND and MORE are 4 digits numbers and MONEY is a 5 digit number, with each letter representing a different number. If I solve the problem without the constraint that all the numbers are different and then select the answer in which they are, the problem runs quickly. If I put the Unequal constraint into Solve, I don't get a result in any reasonable time.
In[1]:= vars = {s, e, n, d, m, o, r, y};
In[2]:= send = 10^Range[0, 3].{d, n, e, s}
Out[2]= d + 100 e + 10 n + 1000 s
In[3]:= more = 10^Range[0, 3].{e, r, o, m}
Out[3]= e + 1000 m + 100 o + 10 r
In[4]:= money = 10^Range[0, 4].{y, e, n, o, m}
Out[4]= 10 e + 10000 m + 100 n + 1000 o + y
In[5]:= AbsoluteTiming @
Length[res =
Solve[{send + more == money,
Sequence @@ Thread[0 <= {e, n, d, o, r, y} <= 9],
Sequence @@ Thread[1 <= {s, m} <= 9]}, vars, Integers]]
Out[5]= {0.0435814, 155}
In[6]:= AbsoluteTiming @
Select[res, Unequal[Sequence @@ (vars /. #)] &]
Out[6]= {0.00142582, {{s -> 9, e -> 5, n -> 6, d -> 7, m -> 1, o -> 0,
r -> 8, y -> 2}}}
In[7]:= TimeConstrained[
Solve[{send + more == money,
Sequence @@ Thread[0 <= {e, n, d, o, r, y} <= 9],
Sequence @@ Thread[1 <= {s, m} <= 9], Unequal[Sequence @@ vars]},
vars, Integers], 100]
Out[7]= $Aborted