Countdown: Difference between revisions

Added Wren
(Description update + Quorum reduction of the number of lines)
(Added Wren)
Line 129:
7500 = 100 * 75
214.0 ms
</pre>
 
=={{header|Wren}}==
{{trans|Quorum}}
{{libheader|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 :)
<syntaxhighlight lang="ecmascript">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()
}</syntaxhighlight>
 
{{out}}
Sample output (as the fourth example is random):
<pre>
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
</pre>
9,488

edits