Countdown: Difference between revisions

Back to initial Quorum solution without compiler memory allocation bug during recursive calls on lists or array data structures
(Remove of output for Quorum solution + explanation added into the incorrect flag)
(Back to initial Quorum solution without compiler memory allocation bug during recursive calls on lists or array data structures)
Line 313:
 
=={{header|Quorum}}==
{{incorrect|Quorum|Compiler not yet reliable}}
<syntaxhighlight lang="quorum">
use Libraries.Containers.List
use Libraries.Containers.Iterator
use Libraries.System.DateTime
use Libraries.Compute.Math
 
action Main
class Countdown
DateTime datetime
 
number start = datetime:GetEpochTime()
List<integer> best = 0numbers
 
numbers:Add(25100)
action Main
numbers:Add(675)
DateTime datetime
numbers:Add(350)
number start = datetime:GetEpochTime()
List<integer> numbers:Add(25)
numbers:Add(1006)
numbers:Add(753)
if not Solution(952,numbers:Add(50)
output "BestNo exact solution found is ." + best
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
number stop = datetime:GetEpochTime()
output stop-start + " ms"
action Solution(integer target, integer res, List<integer> numbers) returns boolean
end
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
 
action Solution(integer target, integer res, List<integer> numbers) returns boolean
if numbers:GetSize() => 01
// All couple of numbers
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)
// NoAll remainingfour operations to be done
integer res = n0 + n10
List<integer> numbersNew
if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy()))
output res + " = "n1 + n0 + " + " + n1
numbersNew = cast(List<integer>, numbers2:Copy())
numbers numbersNew:Add(res)
if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy())numbersNew)
output res + " = " + n0n1 + " -+ " + n1n0
return true
end
best = res = n1 * n0
resnumbersNew = n0cast(List<integer>, * n1numbers2:Copy())
if res = target or SolutionnumbersNew:Add(target, res, cast(List<integer>, numbers2:Copy()))
outputif res + " = " + n0 + " *target "or +Solution(target, n1numbersNew)
output res + " = n0" -+ n1 + " * " + n0
return true
end
return false if n1 > n0
// Substraction and division areres not= symetricaln1 operations- n0
if n0 numbersNew = cast(List<integer>, n1numbers2:Copy())
integer temp = n0numbersNew:Add(res)
n0if res = n1target or Solution(target, numbersNew)
n1 output res + " = temp" + n1 + " - " + n0
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 n0n1 not>= n0 and n1 mod n0 = 0
if n0 mod n1 res = 0n1 / n0
resnumbersNew = n0cast(List<integer>, / n1numbers2:Copy())
if res = target or SolutionnumbersNew:Add(target, res, cast(List<integer>, numbers2:Copy()))
outputif res + " = " + n0 + " /target "or +Solution(target, n1numbersNew)
output res + " = " + n1 + " / " + n0
return true
end
end
end // it1
end // it0
end // if numbers:GetSize() return> false1
endreturn false
 
end
</syntaxhighlight>
{{out}}
 
<pre>
952 = 23800 / 25
23800 = 23850 - 50
23850 = 225 * 106
225 = 3 * 75
106 = 6 + 100
311.0 ms
</pre>
=={{header|Wren}}==
{{trans|Quorum}}
451

edits