SEND + MORE = MONEY: Difference between revisions

m
(→‎Raku:Fast: less verbose with junctions, but no loss of speed ('int' wasn't helping))
m (→‎{{header|Phix}}: minor tidy)
(8 intermediate revisions by 6 users not shown)
Line 247:
{{out}}
<pre>Same as FreeBASIC entry.</pre>
 
=={{header|C}}==
{{trans|Julia}}
<syntaxhighlight lang="c">#include <stdio.h>
 
int main() {
int m = 1, s, e, n, d, o, r, y, sum1, sum2;
const char *f = "%d%d%d%d + %d%d%d%d = %d%d%d%d%d\n";
for (s = 8; s < 10; ++s) {
for (e = 0; e < 10; ++e) {
if (e == m || e == s) continue;
for (n = 0; n < 10; ++n) {
if (n == m || n == s || n == e) continue;
for (d = 0; d < 10; ++d) {
if (d == m || d == s || d == e || d == n) continue;
for (o = 0; o < 10; ++o) {
if (o == m || o == s || o == e || o == n || o == d) continue;
for (r = 0; r < 10; ++r) {
if (r == m || r == s || r == e || r == n || r == d || r == o) continue;
for (y = 0; y < 10; ++y) {
if (y == m || y == s || y == e || y == n || y == d || y == o) continue;
sum1 = 1000*s + 100*e + 10*n + d + 1000*m + 100*o + 10*r + e;
sum2 = 10000*m + 1000*o + 100*n + 10*e + y;
if (sum1 == sum2) {
printf(f, s, e, n, d, m, o, r, e, m, o, n, e, y);
}
}
}
}
}
}
}
}
return 0;
}</syntaxhighlight>
 
{{out}}
<pre>
9567 + 1085 = 10652
</pre>
 
=={{header|FreeBASIC}}==
Line 367 ⟶ 407:
Took 1.149804ms.
</pre>
 
=={{header|J}}==
'''Tacit Solution'''
<syntaxhighlight lang="j">SEND=. 10 #. 0 1 2 3&{
MORE=. 10 #. 4 5 6 1&{
MONEY=. 10 #. 4 5 2 1 7&{
M=. 4&{
entry=. 0&{::
try=. 1&{::
sample=. (10 ?~ 8:) ; 1 + try NB. counting tries to avoid a premature convergence
good=. (not=. -.) (o=.@:) (0 = M) (and=. *.) (SEND + MORE) = MONEY
answer=. (": o SEND , ' + ' , ": o MORE , ' = ' , ": o MONEY) o entry
tries=. ', random tries ' , ": o try
while=. ^: (^:_)
solve=. (answer , tries) o (sample while (not o good o entry)) o ( 0 ;~ i.) o 8: f.</syntaxhighlight>
 
Example use:
<syntaxhighlight lang="j"> solve ''
9567 + 1085 = 10652, random tries 248241
solve ''
9567 + 1085 = 10652, random tries 246504
solve ''
9567 + 1085 = 10652, random tries 3291556</syntaxhighlight>
 
The code is tacit and fixed (in other words, it is point-free):
<syntaxhighlight lang="j"> _80 [\ (5!:5)<'solve'
((":@:(10 (#.) 0 1 2 3&({ )) , ' + ' , ":@:(10 (#.) 4 5 6 1&({ )) , ' = ' , ":@:
(10 (#.) 4 5 2 1 7&({ )))@:(0&({::)) , ', random tries ' , ":@:(1&({::)))@:(((10
?~ 8:) ; 1 + 1&({::))^:(-.@:(-.@:(0 = 4&({ )) *. ((10 (#.) 0 1 2 3&({ )) + 10 (
#.) 4 5 6 1&({ )) = 10 (#.) 4 5 2 1 7&({ ))@:(0&({::)))^:_)@:(0 ;~ i.)@:8:</syntaxhighlight>
 
=={{header|jq}}==
Line 432 ⟶ 510:
end
</syntaxhighlight>{{out}} 9567 + 1085 == 10652
 
=={{header|Nim}}==
{{trans|Julia}}
<syntaxhighlight lang="Nim">import std/strformat
 
let m = 1
for s in 8..9:
for e in 0..9:
if e in [m, s]: continue
for n in 0..9:
if n in [m, s, e]: continue
for d in 0..9:
if d in [m, s, e, n]: continue
for o in 0..9:
if o in [m, s, e, n, d]: continue
for r in 0..9:
if r in [m, s, e, n, d, o]: continue
for y in 0..9:
if y in [m, s, e, n, d, o]: continue
if 1000 * s + 100 * e + 10 * n + d + 1000 * m + 100 * o + 10 * r + e ==
10000 * m + 1000 * o + 100 * n + 10 * e + y:
echo &"{s}{e}{n}{d} + {m}{o}{r}{e} = {m}{o}{n}{e}{y}"
</syntaxhighlight>
 
{{out}}
<pre>9567 + 1085 = 10652
</pre>
 
=={{header|Pascal}}==
Line 691 ⟶ 796:
=={{header|Perl}}==
{{trans|Raku}}
=== Exhaustive ===
<syntaxhighlight lang="perl" line>use v5.36;
use enum <D E M N O R S Y>;
use Algorithm::Combinatorics <combinations permutations>;
 
sub solve {
for my $p (map { permutations $_ } combinations [0..9], 8) {
return $p if @$p[M] > 0 and join('',@$p[S,E,N,D])+join('',@$p[M,O,R,E]) == join('',@$p[M,O,N,E,Y]);
}
}
 
printf "SEND + MORE == MONEY\n%d + %d == %d", join('',@$_[S,E,N,D]), join('',@$_[M,O,R,E]), join '',@$_[M,O,N,E,Y]) for solve();</syntaxhighlight>
{{out}}
<pre>SEND + MORE == MONEY
9567 + 1085 == 10652</pre>
=== Fine-tuned ===
<syntaxhighlight lang="perl" line>use v5.36;
 
Line 732 ⟶ 853:
 
=={{header|Phix}}==
<!--(phixonline)-->
Mighta gota bit carried away here...
<!--<syntaxhighlight lang="phix">(phixonline)-->
atom t0 = time()
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
constant mp = new_dict() -- keys 'A'..'Z', values 0..9
<span style="color: #004080;">sequence</span> <span style="color: #000000;">answer</span>
sequence front, -- 1 if wordstart, else 0, for (0|1)..9
<span style="color: #008080;">procedure</span> <span style="color: #000000;">solve</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">sums</span><span style="color: #0000FF;">,</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">,</span><span style="color: #000000;">firsts</span><span style="color: #0000FF;">,</span><span style="color: #000000;">correct_to</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #000000;">avail</span><span style="color: #0000FF;">,</span><span style="color: #000000;">done</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
multh, -- multiplier hash, see below
<span style="color: #000000;">done</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
used
<span style="color: #004080;">integer</span> <span style="color: #000000;">d</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">solve_order</span><span style="color: #0000FF;">[</span><span style="color: #000000;">done</span><span style="color: #0000FF;">]</span>
 
<span style="color: #008080;">for</span> <span style="color: #000000;">ad</span><span style="color: #0000FF;">=</span><span style="color: #000000;">firsts</span><span style="color: #0000FF;">[</span><span style="color: #000000;">done</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">to</span> <span style="color: #000000;">9</span> <span style="color: #008080;">do</span>
-- mp ends up holding the (first) acceptable solution.
<span style="color: #004080;">integer</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ad</span><span style="color: #0000FF;">)</span>
-- Letters which start any word cannot be 0 (in the rules).
<span style="color: #008080;">if</span> <span style="color: #7060A8;">and_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">avail</span><span style="color: #0000FF;">,</span><span style="color: #000000;">m</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
-- In SEND+MORE=MONEY, 'E' is 100 + 1 - 10 = 91 from the
<span style="color: #000000;">answer</span><span style="color: #0000FF;">[</span><span style="color: #000000;">d</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ad</span>
-- three places E occurs in the puzzle, stored in multh.
<span style="color: #004080;">integer</span> <span style="color: #000000;">ct</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">correct_to</span><span style="color: #0000FF;">[</span><span style="color: #000000;">done</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">carry</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">bOK</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
-- Hence sum(letter_values*multh)==0 means it is solved.
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">ct</span> <span style="color: #008080;">do</span>
-- Obviously used stops us using digits more than once.
<span style="color: #000000;">carry</span> <span style="color: #0000FF;">+=</span> <span style="color: #7060A8;">sum</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">extract</span><span style="color: #0000FF;">(</span><span style="color: #000000;">answer</span><span style="color: #0000FF;">,</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]))</span>
 
<span style="color: #008080;">if</span> <span style="color: #7060A8;">remainder</span><span style="color: #0000FF;">(</span><span style="color: #000000;">carry</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">answer</span><span style="color: #0000FF;">[</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]]</span> <span style="color: #008080;">then</span>
function solve_rec(string uniq, int i, atom s)
<span style="color: #000000;">bOK</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
-- Aside: integer s is fine on 64-bit, but reaches
<span style="color: #008080;">exit</span>
-- a high of 13,304,757,742 & crashes on 32-bit.
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if i > length(uniq) then return s==0 end if
<span style="color: #000000;">carry</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">(</span><span style="color: #000000;">carry</span><span style="color: #0000FF;">/</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)</span>
integer chdx = uniq[i]-'A'+1
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for v=front[chdx] to 9 do
<span style="color: #008080;">if</span> <span style="color: #000000;">bOK</span> <span style="color: #008080;">then</span>
if not used[v+1] then
<span style="color: #008080;">if</span> <span style="color: #000000;">ct</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
used[v+1] = true
<span style="color: #008080;">if</span> <span style="color: #000000;">carry</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">answer</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if solve_rec(uniq,i+1,s+v*multh[chdx]) then
<span style="color: #008080;">else</span>
setd(uniq[i],v,mp)
<span style="color: #000000;">solve</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">,</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">,</span><span style="color: #000000;">firsts</span><span style="color: #0000FF;">,</span><span style="color: #000000;">correct_to</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #000000;">avail</span><span style="color: #0000FF;">-</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">done</span><span style="color: #0000FF;">)</span>
return true
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
used[v+1] = false
<span style="color: #000000;">answer</span><span style="color: #0000FF;">[</span><span style="color: #000000;">d</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
return false
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
end function
 
<span style="color: #008080;">procedure</span> <span style="color: #000000;">cryptarithm</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
function solve(string puzzle)
<span style="color: #004080;">integer</span> <span style="color: #000000;">eq</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'='</span><span style="color: #0000FF;">,</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
destroy_dict(mp,true) -- empty, but keep
<span style="color: #004080;">sequence</span> <span style="color: #000000;">ans</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">trim</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">eq</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$]),</span>
used = repeat(false,10) -- nb [1..10] for 0..9
<span style="color: #000000;">words</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">eq</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">],</span><span style="color: #008000;">'+'</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">trim</span><span style="color: #0000FF;">),</span>
multh = repeat(0,26) -- see above
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">unique</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">words</span><span style="color: #0000FF;">,</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)&</span><span style="color: #000000;">ans</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"STABLE"</span><span style="color: #0000FF;">),</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span>
front = repeat(0,26) -- 1 if 1st in any word
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">)</span>
string uniq = ""
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">w</span> <span style="color: #008080;">in</span> <span style="color: #000000;">words</span> <span style="color: #008080;">do</span>
sequence words = split_any(puzzle," +=\n")
<span style="color: #000000;">words</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">w</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}})</span>
for iw,word in words do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
front[word[1]-'A'+1] = 1
<span style="color: #000000;">ans</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">ans</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">res</span><span style="color: #0000FF;">}})</span>
integer l = length(word),
<span style="color: #004080;">sequence</span> <span style="color: #000000;">sums</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span>
m = iff(iw=length(words)?-1:+1)
<span style="color: #000000;">solve_order</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
for i,ch in word do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ans</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
multh[ch-'A'+1] += m*power(10,l-i)
<span style="color: #004080;">sequence</span> <span style="color: #000000;">set</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
if not find(ch,uniq) then
<span style="color: #008080;">for</span> <span style="color: #000000;">w</span> <span style="color: #008080;">in</span> <span style="color: #000000;">words</span> <span style="color: #008080;">do</span>
uniq &= ch
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">w</span><span style="color: #0000FF;">)>=</span><span style="color: #000000;">i</span> <span style="color: #008080;">then</span>
end if
<span style="color: #004080;">integer</span> <span style="color: #000000;">wi</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #000000;">set</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">wi</span>
end for
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">wi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
if not solve_rec(uniq,1,0) then
<span style="color: #000000;">solve_order</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">wi</span>
return "no solution"
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for i,ch in puzzle do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
if ch>='A' and ch<='Z' then
<span style="color: #004080;">integer</span> <span style="color: #000000;">ai</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">ans</span><span style="color: #0000FF;">[-</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
puzzle[i] = getd(ch,mp)+'0'
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">ai</span><span style="color: #0000FF;">,</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">solve_order</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">ai</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return puzzle
<span style="color: #000000;">sums</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">set</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ai</span><span style="color: #0000FF;">})</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
constant tests = {
<span style="color: #004080;">sequence</span> <span style="color: #000000;">firsts</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">),</span>
"SEND + MORE == MONEY",
<span style="color: #000000;">correct_to</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
"I + BB == ILL",
<span style="color: #008080;">for</span> <span style="color: #000000;">f</span> <span style="color: #008080;">in</span> <span style="color: #7060A8;">unique</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">extract</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">words</span><span style="color: #0000FF;">,{{</span><span style="color: #000000;">1</span><span style="color: #0000FF;">}}}),{})&</span><span style="color: #000000;">ans</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span> <span style="color: #008080;">do</span>
"A == B",
<span style="color: #000000;">firsts</span><span style="color: #0000FF;">[</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">f</span><span style="color: #0000FF;">,</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">)]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span>
"ACA + DD == BD",
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
"A + A + A + A + A + A + A + A + A + A + A + B == BCC",
<span style="color: #004080;">integer</span> <span style="color: #000000;">mm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
"AS + A == MOM",
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fs</span> <span style="color: #008080;">in</span> <span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">flatten</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
"NO + NO + TOO == LATE",
<span style="color: #004080;">integer</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">apply</span><span style="color: #0000FF;">(</span><span style="color: #004600;">true</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">find</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">fs</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">}}))</span>
"HE + SEES + THE == LIGHT",
<span style="color: #000000;">mm</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mm</span><span style="color: #0000FF;">)</span>
"AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE",
<span style="color: #000000;">correct_to</span><span style="color: #0000FF;">[</span><span style="color: #000000;">mm</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">i</span>
"SIX + SEVEN + SEVEN = TWENTY",
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
"THIS+A+FIRE+THEREFORE+FOR+ALL+HISTORIES+I+TELL+A+TALE+THAT+"&
<span style="color: #7060A8;">assert</span><span style="color: #0000FF;">(</span><span style="color: #000000;">correct_to</span><span style="color: #0000FF;">[$]=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">))</span>
"FALSIFIES+ITS+TITLE+TIS+A+LIE+THE+TALE+OF+THE+LAST+FIRE+"&
<span style="color: #000000;">answer</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">)</span>
"HORSES+LATE+AFTER+THE+FIRST+FATHERS+FORESEE+THE+HORRORS+THE+"&
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s - %s is "</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">res</span><span style="color: #0000FF;">})</span>
"LAST+FREE+TROLL+TERRIFIES+THE+HORSES+OF+FIRE+THE+TROLL+RESTS+"&
<span style="color: #000000;">solve</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sums</span><span style="color: #0000FF;">,</span><span style="color: #000000;">solve_order</span><span style="color: #0000FF;">,</span><span style="color: #000000;">firsts</span><span style="color: #0000FF;">,</span><span style="color: #000000;">correct_to</span><span style="color: #0000FF;">,</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0b1_111_111_111</span><span style="color: #0000FF;">)</span>
"AT+THE+HOLE+OF+LOSSES+IT+IS+THERE+THAT+SHE+STORES+ROLES+OF+"&
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
"LEATHERS+AFTER+SHE+SATISFIES+HER+HATE+OFF+THOSE+FEARS+A+TASTE+"&
"RISES+AS+SHE+HEARS+THE+LEAST+FAR+HORSE+THOSE+FAST+HORSES+THAT+"&
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span>
"FIRST+HEAR+THE+TROLL+FLEE+OFF+TO+THE+FOREST+THE+HORSES+THAT+"&
<span style="color: #008000;">`SEND+MORE=MONEY`</span><span style="color: #0000FF;">,</span>
"ALERTS+RAISE+THE+STARES+OF+THE+OTHERS+AS+THE+TROLL+ASSAILS+AT+"&
<span style="color: #008000;">`TO+GO=OUT`</span><span style="color: #0000FF;">,</span>
"THE+TOTAL+SHIFT+HER+TEETH+TEAR+HOOF+OFF+TORSO+AS+THE+LAST+HORSE"&
<span style="color: #008000;">`SEND + A + TAD + MORE = MONEY`</span><span style="color: #0000FF;">,</span>
"+FORFEITS+ITS+LIFE+THE+FIRST+FATHERS+HEAR+OF+THE+HORRORS+THEIR+"&
<span style="color: #008000;">`ABRA + CADABRA + ABRA + CADABRA = HOUDINI`</span><span style="color: #0000FF;">,</span>
"FEARS+THAT+THE+FIRES+FOR+THEIR+FEASTS+ARREST+AS+THE+FIRST+FATHERS"&
<span style="color: #008000;">`I + GUESS + THE + TRUTH = HURTS`</span><span style="color: #0000FF;">,</span>
"+RESETTLE+THE+LAST+OF+THE+FIRE+HORSES+THE+LAST+TROLL+HARASSES+"&
<span style="color: #008000;">`THATS + THE + THEORY = ANYWAY`</span><span style="color: #0000FF;">,</span>
"THE+FOREST+HEART+FREE+AT+LAST+OF+THE+LAST+TROLL+ALL+OFFER+THEIR+"&
<span style="color: #000080;font-style:italic;">-- tad slow, 5.8s vs 0.2s for all above:</span>
"FIRE+HEAT+TO+THE+ASSISTERS+FAR+OFF+THE+TROLL+FASTS+ITS+LIFE+"&
<span style="color: #008000;">`SO+MANY+MORE+MEN+SEEM+TO+SAY+THAT+
"SHORTER+AS+STARS+RISE+THE+HORSES+REST+SAFE+AFTER+ALL+SHARE+HOT+"&
THEY+MAY+SOON+TRY+TO+STAY+AT+HOME+
"FISH+AS+THEIR+AFFILIATES+TAILOR+A+ROOFS+FOR+THEIR+SAFE == FORTRESSES",
SO+AS+TO+SEE+OR+HEAR+THE+SAME+ONE+
"TO + GO = OUT",
MAN+TRY+TO+MEET+THE+TEAM+ON+THE+
"SEND + A + TAD + MORE = MONEY",
MOON+AS+HE+HAS+AT+THE+OTHER+TEN
"ABRA + CADABRA + ABRA + CADABRA = HOUDINI",
=TESTS`</span><span style="color: #0000FF;">}</span>
"I + GUESS + THE + TRUTH = HURTS",
<span style="color: #7060A8;">papply</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tests</span><span style="color: #0000FF;">,</span><span style="color: #000000;">cryptarithm</span><span style="color: #0000FF;">)</span>
"THATS + THE + THEORY = ANYWAY",
<!--</syntaxhighlight>-->
`SO + MANY + MORE + MEN + SEEM + TO + SAY + THAT +
THEY + MAY + SOON + TRY + TO + STAY + AT + HOME +
SO + AS + TO + SEE + OR + HEAR + THE + SAME + ONE +
MAN + TRY + TO + MEET + THE + TEAM + ON + THE +
MOON + AS + HE + HAS + AT + THE + OTHER + TEN =TESTS`,
}
 
for t in tests do
printf(1,"%s\n%s\n\n",{shorten(t,""),shorten(solve(t),"")})
end for
?elapsed(time()-t0)
</syntaxhighlight>
{{out}}
<pre>
SEND + MORE ==MONEY - SENDMORY is {9,5,6,7,1,0,8,2}MONEY
9567 + 1085 == 10652
TO+GO=OUT - TOGU is {2,1,8,0}
 
SEND + A + TAD + MORE = MONEY - SENDATMORY is {9,2,8,3,7,4,1,0,6,5}
I + BB == ILL
ABRA + CADABRA + ABRA + CADABRA = HOUDINI - ABRCDHOUIN is {7,4,5,1,9,3,6,0,8,2}
1 + 99 == 100
I + GUESS + THE + TRUTH = HURTS - IGUESTHR is {5,2,6,8,1,4,7,9}
 
THATS + THE + THEORY = ANYWAY - THASEORYNW is {8,6,9,7,3,2,4,1,5,0}
A == B
SO+MANY+MORE+MEN+SEEM+TO+SAY+THAT+
no solution
THEY+MAY+SOON+TRY+TO+STAY+AT+HOME+
 
SO+AS+TO+SEE+OR+HEAR+THE+SAME+ONE+
ACA + DD == BD
MAN+TRY+TO+MEET+THE+TEAM+ON+THE+
no solution
MOON+AS+HE+HAS+AT+THE+OTHER+TEN
 
=TESTS - SOMANYRETH is {3,1,2,7,6,4,8,0,9,5}
A + A + A + A + A + ...A + A + A + B == BCC
9 + 9 + 9 + 9 + 9 + ...9 + 9 + 9 + 1 == 100
 
AS + A == MOM
92 + 9 == 101
 
NO + NO + TOO == LATE
74 + 74 + 944 == 1092
 
HE + SEES + THE == LIGHT
54 + 9449 + 754 == 10257
 
AND + A + STRONG + O... A + GOOD == DEFENSE
503 + 5 + 691208 + 2... 5 + 8223 == 3474064
 
SIX + SEVEN + SEVEN = TWENTY
650 + 68782 + 68782 = 138214
 
THIS+A+FIRE+THEREFOR...R+SAFE == FORTRESSES
9874+1+5730+98030563...3+4150 == 5639304404
 
TO + GO = OUT
21 + 81 = 102
 
SEND + A + TAD + MORE = MONEY
9283 + 7 + 473 + 1062 = 10825
 
ABRA + CADABRA + ABRA + CADABRA = HOUDINI
7457 + 1797457 + 7457 + 1797457 = 3609828
 
I + GUESS + THE + TRUTH = HURTS
5 + 26811 + 478 + 49647 = 76941
 
THATS + THE + THEORY = ANYWAY
86987 + 863 + 863241 = 951091
 
SO + MANY + MORE + M...+ OTHER + TEN =TESTS
31 + 2764 + 2180 + 2...+ 19508 + 906 =90393
 
"4.8s"
</pre>
 
Line 868 ⟶ 1,041:
+ 1085
= 10652
</pre>
 
=={{header|Python}}==
{{trans|Nim}}
<syntaxhighlight lang="python3">
# SEND + MORE = MONEY by xing216
m = 1
for s in range(8,10):
for e in range(10):
if e in [m, s]: continue
for n in range(10):
if n in [m, s, e]: continue
for d in range(10):
if d in [m, s, e, n]: continue
for o in range(10):
if o in [m, s, e, n, d]: continue
for r in range(10):
if r in [m, s, e, n, d, o]: continue
for y in range(10):
if y in [m, s, e, n, d, o]: continue
if 1000 * s + 100 * e + 10 * n + d + 1000 * m + 100 * o + 10 * r + e == \
10000 * m + 1000 * o + 100 * n + 10 * e + y:
print(f"{s}{e}{n}{d} + {m}{o}{r}{e} = {m}{o}{n}{e}{y}")
</syntaxhighlight>
{{out}}
<pre>
9567 + 1085 = 10652
</pre>
 
Line 1,109 ⟶ 1,309:
{{out}}
<pre>9567 + 1085 == 10652
</pre>
 
=={{header|Vala}}==
{{trans|C}}
<syntaxhighlight lang="vala">void main() {
int m = 1, s, e, n, d, o, r, y, sum1, sum2;
string f = "%d%d%d%d + %d%d%d%d = %d%d%d%d%d\n";
for (s = 8; s < 10; ++s) {
for (e = 0; e < 10; ++e) {
if (e == m || e == s) continue;
for (n = 0; n < 10; ++n) {
if (n == m || n == s || n == e) continue;
for (d = 0; d < 10; ++d) {
if (d == m || d == s || d == e || d == n) continue;
for (o = 0; o < 10; ++o) {
if (o == m || o == s || o == e || o == n || o == d) continue;
for (r = 0; r < 10; ++r) {
if (r == m || r == s || r == e || r == n || r == d || r == o) continue;
for (y = 0; y < 10; ++y) {
if (y == m || y == s || y == e || y == n || y == d || y == o) continue;
sum1 = 1000*s + 100*e + 10*n + d + 1000*m + 100*o + 10*r + e;
sum2 = 10000*m + 1000*o + 100*n + 10*e + y;
if (sum1 == sum2) {
print(f, s, e, n, d, m, o, r, e, m, o, n, e, y);
}
}
}
}
}
}
}
}
}</syntaxhighlight>
 
{{out}}
<pre>
9567 + 1085 = 10652
</pre>
 
=={{header|Wren}}==
Clearly M = 1 and S must be 8 or 9. Brute force can be used to solve for the other letters.
<syntaxhighlight lang="ecmascriptwren">var start = System.clock
var sends = []
var ors = []
7,806

edits