Countdown

Revision as of 08:33, 10 October 2022 by Wherrera (talk | contribs) (julia example)

Given six numbers randomly selected from the list [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 25, 50, 75, 100], calculate using only positive integers and four operations [+, -, *, /] a random number between 101 and 999.

Countdown is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task

Example:

Using: [3, 6, 25, 50, 75, 100]
Target: 952

Solution:

  • 100 + 6 = 106
  • 75 * 3 = 225
  • 106 * 225 = 23850
  • 23850 - 50 = 23800
  • 23800 / 25 = 952


Origins

This is originally a 1972 French television game show. The game consists of randomly selecting six of the twenty-four numbers, from a list of: twenty "small numbers" (two each from 1 to 10), and four "large numbers" of 25, 50, 75 and 100. A random target number between 101 and 999 is generated. The players have 30 seconds to work out a sequence of calculations with the numbers whose final result is as close as possible to the target number. Only the four basic operations: addition, subtraction, multiplication and division can be used to create new numbers and not all six numbers are required. A number can only be used once. Division can only be done if the result has no remainder (fractions are not allowed) and only positive integers can be obtained at any stage of the calculation. (More info on the original game).


Extra challenge

The brute force algorithm is quite obvious. What is more interesting is to find some optimisation heuristics to reduce the number of calculations. For example, a rather interesting computational challenge is to calculate, as fast as possible, all existing solutions (that means 2'764'800 operations) for all possible games (with all the 13'243 combinations of six numbers out of twenty-four for all 898 possible targets between 101 and 999).


J

Brute force implementation:

deck=: (25*1+i.4),2#1+i.10
deal=: 6&((?#){])@deck
targ=: 101+?@899
Pi=: ,~((#:I.@,)</~)i.
Va=: {{
  ok=. I#~(= 1>.>.)u&".&>/y{~|:I=. Pi N=.#y
  (N-1){."1 (y{~ok-."1~i.N),.<@(u expr)"1 ok{y
}}
Pa=: {{ if. 1<#;:y do. '(',y,')' else. y end. }}
expr=: {{ (Pa A),(;u`''),Pa B['A B'=.y }}
arith=: [:; <@(+Va, -Va, *Va, %Va,(-Va, %Va)@|.)"1
all=: {{ A#~x=".@>A=.~.,arith^:5 ":each y}}

task=: {{
   echo 'terms: ',":c=. /:~ deal ''
   echo 'target: ',":t=. targ ''
   echo '#solutions: ',":#a=. t all c
   echo 'for example: ',;{.a
}}

Examples:

   task''
terms: 2 3 3 6 9 50
target: 476
#solutions: 77
for example: (9*(3+50))-(6-(2+3))
   task''
terms: 1 4 6 7 8 9
target: 657
#solutions: 75
for example: 9*(8+((1+4)*(6+7)))
   task''
terms: 4 7 8 9 10 10
target: 300
#solutions: 495
for example: (10+(9*10))*((4+7)-8)

Julia

Brute force with a somewhat narrowed search space.

using Combinatorics

const max_pick = 6
const fulllist = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 25, 50, 75, 100]
const oplist = [+, +, +, +, +, +,  -, -, -, -, -, -,  *, *, *, *, *, *, ÷, ÷, ÷, ÷, ÷, ÷]


function single_countdown_game(ilist, target)
    candidates = [(0, "")]
    for i in 1:max_pick, arr in permutations(ilist, i), ops in multiset_permutations(oplist, length(arr) - 1)
        candidate = arr[1]
        if !isempty(ops)
            for (j, op) in pairs(ops)
                ((op == ÷) && candidate % arr[j + 1] != 0) && @goto nextops
                candidate = op(candidate, arr[j + 1])
            end
        end
        if abs(candidate - target) <= abs(candidates[1][1] - target)
            if abs(candidate - target) < abs(candidates[1][1] - target)
                empty!(candidates)
            end
            sops = push!(map(string, ops), "")
            push!(candidates, (candidate, prod(" $(arr[i]); $(sops[i])" for i in eachindex(arr))))
        end
        @label nextops
    end
    return unique(candidates)
end

for (terms, target) in [([2, 3, 3, 6, 9, 50], 476), ([1, 4, 6, 7, 8, 9], 657), ([4, 7, 8, 9, 10, 10], 300)]
    sols = single_countdown_game(terms, target)
    println("$(length(sols)) solutions for terms $terms, target $target.")
    println("  Example: $(sols[1][2])= $(sols[1][1])\n")
end
</syntaxhoghlight>{{out}}
<pre>
24 solutions for terms [2, 3, 3, 6, 9, 50], target 476.
  Example:  3; + 50; * 9; + 2; - 3; = 476

42 solutions for terms [1, 4, 6, 7, 8, 9], target 657.
  Example:  4; + 6; * 8; - 7; * 9; = 657

223 solutions for terms [4, 7, 8, 9, 10, 10], target 300.
  Example:  7; - 4; * 10; * 10; = 300
</pre>



=={{header|Phix}}==
Here's one I already had, cleaned up a bit:
<!--<syntaxhighlight lang="phix">(phixonline)-->
 <span style="color: #000080;font-style:italic;">--
 -- demo/Countdown.exw
 --
 -- solves the numbers game from countdown.
 --</span>
 <span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
 <span style="color: #008080;">constant</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">6</span><span style="color: #0000FF;">,</span>
          <span style="color: #000000;">ops</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"+-*/"</span>
 <span style="color: #008080;">enum</span> <span style="color: #000000;">ADD</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">SUB</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">MUL</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">DIV</span>
 
 <span style="color: #004080;">sequence</span> <span style="color: #000000;">chosen</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;">n</span><span style="color: #0000FF;">),</span> <span style="color: #000080;font-style:italic;">-- original numbers &lt;-&gt; partial sums</span>
      <span style="color: #000000;">expression</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;">n</span><span style="color: #0000FF;">),</span> <span style="color: #000080;font-style:italic;">-- the operations tried so far</span>
        <span style="color: #000000;">solution</span> <span style="color: #000080;font-style:italic;">-- (a/best snapshot of expression)</span>
 
 <span style="color: #004080;">int</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">,</span>    <span style="color: #000080;font-style:italic;">-- n+1 means no solution yet found</span>
     <span style="color: #000000;">maxlev</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- recursion limit (5, drops as solns found)</span>
     <span style="color: #000000;">near</span><span style="color: #0000FF;">,</span>   <span style="color: #000080;font-style:italic;">-- nearest answer (in solution) out by this</span>
     <span style="color: #000000;">lenn</span><span style="color: #0000FF;">,</span>   <span style="color: #000080;font-style:italic;">-- length of ""         ""</span>
     <span style="color: #000000;">target</span>
 
 <span style="color: #008080;">procedure</span> <span style="color: #000000;">countdown</span><span style="color: #0000FF;">(</span><span style="color: #004080;">int</span> <span style="color: #000000;">level</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
 <span style="color: #000080;font-style:italic;">--
 -- Recursive search - takes two numbers, performs an op (storing result), checks
 -- for target value, and calls itself. All solutions are stored, to find shortest, 
 -- so that, for example, 100+1 is chosen instead of 100+(75/25)-1-1. 
 -- Optimizations are made to ensure commutative operations are only performed one 
 -- way round, division is only performed when no remainder, and */1 are skipped.
 --</span>
     <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;">n</span> <span style="color: #008080;">do</span>
         <span style="color: #004080;">integer</span> <span style="color: #000000;">sti</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">chosen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- speedwise/save</span>
         <span style="color: #008080;">if</span> <span style="color: #000000;">sti</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
             <span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
                 <span style="color: #004080;">integer</span> <span style="color: #000000;">stj</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">chosen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- ""</span>
                 <span style="color: #008080;">if</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">j</span> <span style="color: #008080;">and</span> <span style="color: #000000;">stj</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
                     <span style="color: #008080;">for</span> <span style="color: #000000;">operation</span><span style="color: #0000FF;">=</span><span style="color: #000000;">ADD</span> <span style="color: #008080;">to</span> <span style="color: #000000;">DIV</span> <span style="color: #008080;">do</span>
                         <span style="color: #008080;">if</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">operation</span><span style="color: #0000FF;"><</span><span style="color: #000000;">DIV</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">sti</span><span style="color: #0000FF;">,</span><span style="color: #000000;">stj</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
                         <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">operation</span><span style="color: #0000FF;"><</span><span style="color: #000000;">MUL</span> <span style="color: #008080;">or</span> <span style="color: #000000;">stj</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
                         <span style="color: #008080;">and</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">sti</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">stj</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
                             <span style="color: #000080;font-style:italic;">-- worth doing...</span>
                             <span style="color: #004080;">integer</span> <span style="color: #000000;">ci</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">sti</span>
                             <span style="color: #008080;">switch</span> <span style="color: #000000;">operation</span> <span style="color: #008080;">do</span>
                                 <span style="color: #008080;">case</span> <span style="color: #000000;">ADD</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">ci</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">stj</span>
                                 <span style="color: #008080;">case</span> <span style="color: #000000;">SUB</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">ci</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">stj</span>
                                 <span style="color: #008080;">case</span> <span style="color: #000000;">MUL</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">ci</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">stj</span>
                                 <span style="color: #008080;">case</span> <span style="color: #000000;">DIV</span><span style="color: #0000FF;">:</span> <span style="color: #000000;">ci</span> <span style="color: #0000FF;">/=</span> <span style="color: #000000;">stj</span>
                             <span style="color: #008080;">end</span> <span style="color: #008080;">switch</span>
                             <span style="color: #000000;">chosen</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: #000000;">ci</span>
                             <span style="color: #000000;">chosen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
                             <span style="color: #000080;font-style:italic;">/* store operands and operator */</span>
                             <span style="color: #000000;">expression</span><span style="color: #0000FF;">[</span><span style="color: #000000;">level</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">sti</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ops</span><span style="color: #0000FF;">[</span><span style="color: #000000;">operation</span><span style="color: #0000FF;">],</span><span style="color: #000000;">stj</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ci</span><span style="color: #0000FF;">}</span>
                                                         
                             <span style="color: #000080;font-style:italic;">-- check for solution</span>
                             <span style="color: #008080;">if</span> <span style="color: #000000;">ci</span><span style="color: #0000FF;">==</span><span style="color: #000000;">target</span> <span style="color: #008080;">then</span>
                                 <span style="color: #008080;">if</span> <span style="color: #000000;">level</span><span style="color: #0000FF;"><</span><span style="color: #000000;">len</span> <span style="color: #008080;">then</span>
                                     <span style="color: #000080;font-style:italic;">/* solution is shortest so far - store it */</span>
                                     <span style="color: #000000;">len</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">level</span>
                                     <span style="color: #000000;">maxlev</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">level</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span>
                                     <span style="color: #000000;">near</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
                                     <span style="color: #000000;">solution</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">expression</span><span style="color: #0000FF;">)</span>
                                 <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
                             <span style="color: #008080;">else</span>
                                 <span style="color: #000080;font-style:italic;">--store closest?</span>
                                 <span style="color: #004080;">integer</span> <span style="color: #000000;">offby</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">target</span><span style="color: #0000FF;">-</span><span style="color: #000000;">ci</span><span style="color: #0000FF;">)</span>
                                 <span style="color: #008080;">if</span> <span style="color: #000000;">offby</span><span style="color: #0000FF;"><</span><span style="color: #000000;">near</span> <span style="color: #008080;">then</span>
                                     <span style="color: #000000;">near</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">offby</span>
                                     <span style="color: #000000;">lenn</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">level</span>
                                     <span style="color: #000000;">solution</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">expression</span><span style="color: #0000FF;">)</span>
                                 <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
                                 <span style="color: #000080;font-style:italic;">-- if not at required level, recurse</span>
                                 <span style="color: #008080;">if</span> <span style="color: #000000;">level</span><span style="color: #0000FF;"><</span><span style="color: #000000;">maxlev</span> <span style="color: #008080;">then</span>
                                     <span style="color: #000000;">countdown</span><span style="color: #0000FF;">(</span><span style="color: #000000;">level</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
                                 <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
                             <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
                             <span style="color: #000080;font-style:italic;">-- undo</span>
                             <span style="color: #000000;">chosen</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: #000000;">sti</span>
                             <span style="color: #000000;">chosen</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">stj</span>
                         <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
                     <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
                 <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
             <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
         <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
     <span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
 <span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
 <span style="color: #008080;">procedure</span> <span style="color: #000000;">test</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">list</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">int</span> <span style="color: #000000;">dest</span><span style="color: #0000FF;">)</span>
     <span style="color: #000000;">len</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span>
     <span style="color: #000000;">maxlev</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">5</span>
     <span style="color: #000000;">near</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dest</span>
     <span style="color: #000000;">target</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">dest</span>
     <span style="color: #000000;">chosen</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">list</span><span style="color: #0000FF;">)</span>
     <span style="color: #000000;">countdown</span><span style="color: #0000FF;">()</span>
     <span style="color: #000080;font-style:italic;">/* process solution into printable form */</span>
     <span style="color: #004080;">string</span> <span style="color: #000000;">off</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"exact"</span>
     <span style="color: #008080;">if</span> <span style="color: #000000;">len</span><span style="color: #0000FF;">=</span><span style="color: #000000;">n</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
         <span style="color: #000000;">off</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"off by %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">near</span><span style="color: #0000FF;">)</span>
         <span style="color: #000000;">len</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lenn</span>
     <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
     <span style="color: #004080;">string</span> <span style="color: #000000;">soln</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;">sprintf</span><span style="color: #0000FF;">,{{</span><span style="color: #008000;">"%d%c%d=%d"</span><span style="color: #0000FF;">},</span><span style="color: #000000;">solution</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">len</span><span style="color: #0000FF;">]}),</span><span style="color: #008000;">", "</span><span style="color: #0000FF;">)</span>
     <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;">"Target %d from %18v: %s (%s)\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">dest</span><span style="color: #0000FF;">,</span><span style="color: #000000;">list</span><span style="color: #0000FF;">,</span><span style="color: #000000;">soln</span><span style="color: #0000FF;">,</span><span style="color: #000000;">off</span><span style="color: #0000FF;">})</span>
 <span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
 <span style="color: #004080;">atom</span> <span style="color: #000000;">t0</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">time</span><span style="color: #0000FF;">()</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">75</span><span style="color: #0000FF;">,</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span><span style="color: #000000;">25</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">},</span><span style="color: #000000;">737</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">25</span><span style="color: #0000FF;">,</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span><span style="color: #000000;">75</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">},</span><span style="color: #000000;">952</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span><span style="color: #000000;">75</span><span style="color: #0000FF;">,</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span><span style="color: #000000;">25</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">},</span><span style="color: #000000;">952</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">},</span><span style="color: #000000;">203</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">25</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">},</span><span style="color: #000000;">465</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},</span><span style="color: #000000;">241</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},</span><span style="color: #000000;">824</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">75</span><span style="color: #0000FF;">,</span><span style="color: #000000;">50</span><span style="color: #0000FF;">,</span><span style="color: #000000;">25</span><span style="color: #0000FF;">,</span><span style="color: #000000;">100</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">},</span><span style="color: #000000;">125</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">6</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">},</span><span style="color: #000000;">594</span><span style="color: #0000FF;">)</span>
 <span style="color: #000000;">test</span><span style="color: #0000FF;">({</span><span style="color: #000000;">2</span><span style="color: #0000FF;">,</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">9</span><span style="color: #0000FF;">,</span><span style="color: #000000;">10</span><span style="color: #0000FF;">,</span><span style="color: #000000;">3</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span><span style="color: #000000;">363</span><span style="color: #0000FF;">)</span>
 <span style="color: #000080;font-style:italic;">--test(shuffle(tagset(10)&tagset(10)&tagstart(25,4,25))[1..6],100+rand(899))</span>
 <span style="color: #0000FF;">?</span><span style="color: #7060A8;">time</span><span style="color: #0000FF;">()-</span><span style="color: #000000;">t0</span>
 
 <span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<!--

-->

Output:
Target 737 from {75,50,25,100,8,2}: 75/25=3, 50-3=47, 100-2=98, 98*8=784, 784-47=737 (exact)
Target 952 from {3,6,25,50,75,100}: 75*3=225, 100+6=106, 225*106=23850, 23850-50=23800, 23800/25=952 (exact)
Target 952 from {100,75,50,25,6,3}: 100+6=106, 106*75=7950, 7950*3=23850, 23850-50=23800, 23800/25=952 (exact)
Target 203 from   {50,100,4,2,2,4}: 50*4=200, 200+4=204, 2/2=1, 204-1=203 (exact)
Target 465 from    {25,4,9,2,3,10}: 25-10=15, 9*3=27, 27+4=31, 31*15=465 (exact)
Target 241 from     {9,8,10,5,9,7}: 9+9=18, 8+5=13, 18*13=234, 234+7=241 (exact)
Target 824 from      {3,7,6,2,1,7}: 7+3=10, 10*6=60, 60-1=59, 59*2=118, 118*7=826 (off by 2)
Target 125 from {75,50,25,100,8,2}: 75+50=125 (exact)
Target 594 from      {8,4,4,6,8,9}: 8*8=64, 64-4=60, 60+6=66, 66*9=594 (exact)
Target 363 from     {2,4,9,10,3,5}: 9*4=36, 36*10=360, 360+3=363 (exact)
1.797

Quorum

use Libraries.Containers.List
use Libraries.Containers.Iterator
use Libraries.System.DateTime
use Libraries.Compute.Math

class Countdown

    integer best = 0

    action Main
        DateTime datetime
        number start = datetime:GetEpochTime() 
        List<integer> numbers
        numbers:Add(100)
        numbers:Add(75)
        numbers:Add(50)
        numbers:Add(25)
        numbers:Add(6)
        numbers:Add(3)
        if not Solution(952,0,numbers)
            output "Best solution found is " + best
        end
        number stop = datetime:GetEpochTime() 
        output stop-start + " ms"
    end
    
    action Solution(integer target, integer res, List<integer> numbers) returns boolean
        
        Math math

        // Check closest solution
        if math:AbsoluteValue(target-best) > math:AbsoluteValue(target-res)
            best = res
        end

        // No remaining operations to be done
        if numbers:GetSize() = 0
            return false
        end

        // Initial call only
        if res not= 0
            numbers:Add(res)    
        end

        Iterator<integer> it0 = numbers:GetIterator()
        repeat while it0:HasNext()
    
            integer n0 = it0:Next()
            List<integer> numbers1 = cast(List<integer>, numbers:Copy())   
            numbers1:Remove(n0)
    
            Iterator<integer> it1 = numbers1:GetIterator()
            repeat while it1:HasNext()
    
                integer n1 = it1:Next()
                List<integer> numbers2 = cast(List<integer>, numbers1:Copy())
                numbers2:Remove(n1)
    
                res = n0 + n1
                if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy()))
                    output res + " = " + n0 + " + " + n1
                    return true
                end
    
                res = n0 * n1
                if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy()))
                    output res + " = " + n0 + " * " + n1
                    return true
                end
    
                // Substraction and division are not symetrical operations
                if n0 < n1
                    integer temp = n0
                    n0 = n1
                    n1 = temp
                end
    
                if n0 not= n1
                    res = n0 - n1
                    if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy()))
                        output res + " = " + n0 + " - " + n1
                        return true
                    end
                end
    
                if n0 mod n1 = 0
                    res = n0 / n1
                    if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy()))
                        output res + " = " + n0 + " / " + n1
                        return true
                    end
                end
            end
        end
        return false
    end

end
Output:
952 = 50 + 902
902 = 22550 / 25
22550 = 50 + 22500
22500 = 7500 * 3
7500 = 100 * 75
214.0 ms

Wren

Translation of: Quorum
Library: Wren-fmt

This is based on the original Quorum algorithm as it's more or less the approach I'd have used anyway.

The latest algorithm is not working properly as numbers are being used twice (50 in the first example).

A bit slow but not too bad for Wren :)

import "random" for Random
import "./fmt" for Fmt

var countdown // recursive function
countdown = Fn.new { |numbers, target|
    if (numbers.count == 1) return false
    for (n0 in numbers) {
        var nums1 = numbers.toList
        nums1.remove(n0)
        for (n1 in nums1) {
            var nums2 = nums1.toList
            nums2.remove(n1)
            var res = n0 + n1
            var numsNew = nums2.toList
            numsNew.add(res)
            if (res == target || countdown.call(numsNew, target)) {
                Fmt.print("$d = $d + $d", res, n0, n1)
                return true
            }

            res = n0 * n1
            numsNew = nums2.toList
            numsNew.add(res)
            if (res == target || countdown.call(numsNew, target)) {
                Fmt.print("$d = $d * $d", res, n0, n1)
                return true
            }

            if (n0 > n1) {
                res = n0 - n1
                numsNew = nums2.toList
                numsNew.add(res)
                if (res == target || countdown.call(numsNew, target)) {
                    Fmt.print("$d = $d - $d", res, n0, n1)
                    return true
                }
            } else if (n1 > n0) {
                res = n1 - n0
                numsNew = nums2.toList
                numsNew.add(res)
                if (res == target || countdown.call(numsNew, target)) {
                    Fmt.print("$d = $d - $d", res, n1, n0)
                    return true
                }
            }

            if (n0 > n1) {
                if (n0 % n1 == 0) {
                    res = n0 / n1
                    numsNew = nums2.toList
                    numsNew.add(res)
                    if (res == target || countdown.call(numsNew, target)) {
                        Fmt.print("$d = $d / $d", res, n0, n1)
                        return true
                    }
                }
            } else {
                if (n1 % n0 == 0) {
                    res = n1 / n0
                    numsNew = nums2.toList
                    numsNew.add(res)
                    if (res == target || countdown.call(numsNew, target)) {
                        Fmt.print("$d = $d / $d", res, n1, n0)
                        return true
                    }
                }
            }
        }
    }
    return false
}

var allNumbers = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 25, 50, 75, 100]
var rand = Random.new()
var numbersList = [
    [3, 6, 25, 50, 75, 100],
    [100, 75, 50, 25, 6, 3], // see if there's much difference if we reverse the first example
    [8, 4, 4, 6, 8, 9],
    rand.sample(allNumbers, 6)
]
var targetList = [952, 952, 594, rand.int(101, 1000)]
for (i in 0...numbersList.count) {
    System.print("Using : %(numbersList[i])")
    System.print("Target: %(targetList[i])")
    var start = System.clock
    var done = countdown.call(numbersList[i], targetList[i])
    System.print("Took %(((System.clock - start) * 1000).round) ms")
    if (!done) System.print("No solution exists")
    System.print()
}
Output:

Sample output (as the fourth example is random):

Using : [3, 6, 25, 50, 75, 100]
Target: 952
952 = 23800 / 25
23800 = 23850 - 50
23850 = 225 * 106
106 = 6 + 100
225 = 3 * 75
Took 1525 ms

Using : [100, 75, 50, 25, 6, 3]
Target: 952
952 = 23800 / 25
23800 = 23850 - 50
23850 = 106 * 225
225 = 75 * 3
106 = 100 + 6
Took 1522 ms

Using : [8, 4, 4, 6, 8, 9]
Target: 594
594 = 54 * 11
11 = 8 + 3
54 = 6 * 9
3 = 12 / 4
12 = 8 + 4
Took 27 ms

Using : [2, 4, 9, 10, 3, 5]
Target: 363
363 = 3 + 360
360 = 9 * 40
40 = 10 + 30
30 = 5 * 6
6 = 2 + 4
Took 107 ms