Hourglass puzzle: Difference between revisions
Content added Content deleted
Line 365: | Line 365: | ||
</lang> |
</lang> |
||
=={{header|Nim}}== |
|||
{{trans|Wren}} |
|||
<lang Nim>import math, strutils |
|||
func hourglassFlipper(hourglasses: openArray[int]; |
|||
target: int): tuple[start: int; series: seq[int]] = |
|||
var flippers = @hourglasses |
|||
for _ in 0..10_000: |
|||
let n = min(flippers) |
|||
result.series.add n |
|||
for i in 0..flippers.high: |
|||
dec flippers[i], n |
|||
if flippers[i] == 0: flippers[i] = hourglasses[i] |
|||
result.start = result.series.high |
|||
while result.start >= 0: |
|||
if sum(result.series[result.start..^1]) == target: return |
|||
dec result.start |
|||
raise newException(ValueError, "Unable to find an answer within 10_000 iterations.") |
|||
echo "Flip an hourglass every time it runs out of grains, " |
|||
echo "and note the interval in time." |
|||
const Tests = [(@[4, 7], 9), (@[5, 7, 31], 36)] |
|||
for test in Tests: |
|||
let |
|||
hourglasses = test[0] |
|||
target = test[1] |
|||
(start, series) = hourglassFlipper(hourglasses, target) |
|||
`end` = series.high |
|||
echo "\nSeries: ", series.join(" ") |
|||
echo "Use hourglasses from indices $1 to $2 (inclusive) to sum ".format(start, `end`), |
|||
"$1 using $2.".format(target, hourglasses.join(" "))</lang> |
|||
{{out}} |
|||
<pre>Flip an hourglass every time it runs out of grains, |
|||
and note the interval in time. |
|||
Series: 4 3 1 4 2 2 |
|||
Use hourglasses from indices 2 to 5 (inclusive) to sum 9 using 4 7. |
|||
Series: 5 2 3 4 1 5 1 4 3 2 1 4 5 2 3 4 1 |
|||
Use hourglasses from indices 4 to 16 (inclusive) to sum 36 using 5 7 31.</pre> |
|||
=={{header|Python}}== |
=={{header|Python}}== |