SEND + MORE = MONEY: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Changed to Wren S/H) |
m (→{{header|Phix}}: Replaced with a faster version, use pygments) |
||
Line 853: | Line 853: | ||
=={{header|Phix}}== |
=={{header|Phix}}== |
||
<!--(phixonline)--> |
|||
Mighta gota bit carried away here... |
|||
<syntaxhighlight lang="phix"> |
|||
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(chdx,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> |
|||
setd(ch-'A'+1,-1,mp) |
|||
<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 if |
|||
<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> |
|||
end for |
|||
<span style="color: #000000;">solve_order</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">wi</span> |
|||
if not solve_rec(uniq,1,0) then |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</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;">for</span> |
|||
for i,ch in puzzle do |
|||
<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> |
|||
if ch>='A' and ch<='Z' then |
|||
<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> |
|||
puzzle[i] = getd(ch-'A'+1,mp)+'0' |
|||
<span style="color: #000000;">solve_order</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">ai</span> |
|||
end if |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span> |
|||
end for |
|||
<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> |
|||
return puzzle |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
end function |
|||
<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> |
|||
<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> |
|||
constant tests = { |
|||
<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> |
|||
"SEND + MORE == MONEY", |
|||
<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> |
|||
"I + BB == ILL", |
|||
<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> |
|||
"A == B", |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
"ACA + DD == BD", |
|||
<span style="color: #004080;">integer</span> <span style="color: #000000;">mm</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> |
|||
"A + A + A + A + A + A + A + A + A + A + A + B == BCC", |
|||
<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> |
|||
"AS + A == MOM", |
|||
<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> |
|||
"NO + NO + TOO == LATE", |
|||
<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> |
|||
"HE + SEES + THE == LIGHT", |
|||
<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> |
|||
"AND + A + STRONG + OFFENSE + AS + A + GOOD == DEFENSE", |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span> |
|||
"SIX + SEVEN + SEVEN = TWENTY", |
|||
<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> |
|||
"THIS+A+FIRE+THEREFORE+FOR+ALL+HISTORIES+I+TELL+A+TALE+THAT+"& |
|||
<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> |
|||
"FALSIFIES+ITS+TITLE+TIS+A+LIE+THE+TALE+OF+THE+LAST+FIRE+"& |
|||
<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> |
|||
"HORSES+LATE+AFTER+THE+FIRST+FATHERS+FORESEE+THE+HORRORS+THE+"& |
|||
<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> |
|||
"LAST+FREE+TROLL+TERRIFIES+THE+HORSES+OF+FIRE+THE+TROLL+RESTS+"& |
|||
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span> |
|||
"AT+THE+HOLE+OF+LOSSES+IT+IS+THERE+THAT+SHE+STORES+ROLES+OF+"& |
|||
"LEATHERS+AFTER+SHE+SATISFIES+HER+HATE+OFF+THOSE+FEARS+A+TASTE+"& |
|||
<span style="color: #008080;">constant</span> <span style="color: #000000;">tests</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span> |
|||
"RISES+AS+SHE+HEARS+THE+LEAST+FAR+HORSE+THOSE+FAST+HORSES+THAT+"& |
|||
<span style="color: #008000;">`SEND+MORE=MONEY`</span><span style="color: #0000FF;">,</span> |
|||
"FIRST+HEAR+THE+TROLL+FLEE+OFF+TO+THE+FOREST+THE+HORSES+THAT+"& |
|||
<span style="color: #008000;">`TO+GO=OUT`</span><span style="color: #0000FF;">,</span> |
|||
"ALERTS+RAISE+THE+STARES+OF+THE+OTHERS+AS+THE+TROLL+ASSAILS+AT+"& |
|||
<span style="color: #008000;">`SEND + A + TAD + MORE = MONEY`</span><span style="color: #0000FF;">,</span> |
|||
"THE+TOTAL+SHIFT+HER+TEETH+TEAR+HOOF+OFF+TORSO+AS+THE+LAST+HORSE"& |
|||
<span style="color: #008000;">`ABRA + CADABRA + ABRA + CADABRA = HOUDINI`</span><span style="color: #0000FF;">,</span> |
|||
"+FORFEITS+ITS+LIFE+THE+FIRST+FATHERS+HEAR+OF+THE+HORRORS+THEIR+"& |
|||
<span style="color: #008000;">`I + GUESS + THE + TRUTH = HURTS`</span><span style="color: #0000FF;">,</span> |
|||
"FEARS+THAT+THE+FIRES+FOR+THEIR+FEASTS+ARREST+AS+THE+FIRST+FATHERS"& |
|||
<span style="color: #008000;">`THATS + THE + THEORY = ANYWAY`</span><span style="color: #0000FF;">,</span> |
|||
"+RESETTLE+THE+LAST+OF+THE+FIRE+HORSES+THE+LAST+TROLL+HARASSES+"& |
|||
<span style="color: #000080;font-style:italic;">-- tad slow, 5.8s vs 0.2s for all above:</span> |
|||
"THE+FOREST+HEART+FREE+AT+LAST+OF+THE+LAST+TROLL+ALL+OFFER+THEIR+"& |
|||
<span style="color: #008000;">`SO+MANY+MORE+MEN+SEEM+TO+SAY+THAT+ |
|||
"FIRE+HEAT+TO+THE+ASSISTERS+FAR+OFF+THE+TROLL+FASTS+ITS+LIFE+"& |
|||
THEY+MAY+SOON+TRY+TO+STAY+AT+HOME+ |
|||
"SHORTER+AS+STARS+RISE+THE+HORSES+REST+SAFE+AFTER+ALL+SHARE+HOT+"& |
|||
SO+AS+TO+SEE+OR+HEAR+THE+SAME+ONE+ |
|||
"FISH+AS+THEIR+AFFILIATES+TAILOR+A+ROOFS+FOR+THEIR+SAFE == FORTRESSES", |
|||
MAN+TRY+TO+MEET+THE+TEAM+ON+THE+ |
|||
"TO + GO = OUT", |
|||
MOON+AS+HE+HAS+AT+THE+OTHER+TEN |
|||
"SEND + A + TAD + MORE = MONEY", |
|||
=TESTS`</span><span style="color: #0000FF;">}</span> |
|||
"ABRA + CADABRA + ABRA + CADABRA = HOUDINI", |
|||
<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> |
|||
"I + GUESS + THE + TRUTH = HURTS", |
|||
<!--</syntaxhighlight>--> |
|||
"THATS + THE + THEORY = ANYWAY", |
|||
`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}} |
{{out}} |
||
<pre> |
<pre> |
||
SEND+MORE= |
SEND + MORE == 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> |
</pre> |
||