Countdown: Difference between revisions
Content added Content deleted
(Added Wren) |
(→{{header|Quorum}}: Management of closest solutions.) |
||
Line 36: | Line 36: | ||
use Libraries.Containers.Iterator |
use Libraries.Containers.Iterator |
||
use Libraries.System.DateTime |
use Libraries.System.DateTime |
||
use Libraries.Compute.Math |
|||
class Countdown |
|||
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) |
|||
Solution(952,numbers) |
|||
number stop = datetime:GetEpochTime() |
|||
output stop-start + " ms" |
|||
end |
|||
integer best = 0 |
|||
action Solution(integer target, List<integer> numbers) returns boolean |
|||
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 |
|||
if numbers:GetSize() = 1 |
|||
Math math |
|||
// Check closest solution |
|||
Iterator<integer> it0 = numbers:GetIterator() |
|||
if math:AbsoluteValue(target-best) > math:AbsoluteValue(target-res) |
|||
repeat while it0:HasNext() |
|||
best = res |
|||
end |
|||
// No remaining operations to be done |
|||
List<integer> numbers1 = cast(List<integer>, numbers:Copy()) |
|||
if numbers:GetSize() = 0 |
|||
return false |
|||
end |
|||
Iterator<integer> it1 = numbers1:GetIterator() |
|||
// Initial call only |
|||
if res not= 0 |
|||
numbers:Add(res) |
|||
end |
|||
Iterator<integer> it0 = numbers:GetIterator() |
|||
repeat while it0:HasNext() |
|||
List<integer> numbers2 = cast(List<integer>, numbers1:Copy()) |
|||
numbers2:Remove(n1) |
|||
integer n0 = it0:Next() |
|||
integer |
List<integer> numbers1 = cast(List<integer>, numbers:Copy()) |
||
numbers1:Remove(n0) |
|||
Iterator<integer> it1 = numbers1:GetIterator() |
|||
repeat while it1:HasNext() |
|||
numbersNew:Add(res) |
|||
integer n1 = it1:Next() |
|||
List<integer> numbers2 = cast(List<integer>, numbers1:Copy()) |
|||
numbers2:Remove(n1) |
|||
res = n0 + n1 |
|||
res = |
if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy())) |
||
output res + " = " + n0 + " + " + n1 |
|||
numbersNew:Add(res) |
|||
if res = target or Solution(target, numbersNew) |
|||
output res + " = " + n0 + " * " + n1 |
|||
return true |
|||
end |
|||
if n0 < n1 |
|||
integer temp = n0 |
|||
n0 = n1 |
|||
n1 = temp |
|||
end |
|||
if n0 not= n1 |
|||
res = n0 - n1 |
|||
numbersNew = cast(List<integer>, numbers2:Copy()) |
|||
numbersNew:Add(res) |
|||
if res = target or Solution(target, numbersNew) |
|||
output res + " = " + n0 + " - " + n1 |
|||
return true |
return true |
||
end |
end |
||
res = n0 * n1 |
|||
if res = target or Solution(target, res, cast(List<integer>, numbers2:Copy())) |
|||
if n0 mod n1 = 0 |
|||
res = n0 |
output res + " = " + n0 + " * " + n1 |
||
numbersNew = cast(List<integer>, numbers2:Copy()) |
|||
numbersNew:Add(res) |
|||
if res = target or Solution(target, numbersNew) |
|||
output res + " = " + n0 + " / " + n1 |
|||
return true |
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 |
end |
||
end |
end |
||
return false |
|||
end |
end |
||
return false |
|||
end |
end |
||
</syntaxhighlight> |
</syntaxhighlight> |