Hourglass puzzle: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(11 intermediate revisions by 10 users not shown)
Line 1:
{{draft task}}
 
[[Category:Puzzles]]
[[Category:Games]]
 
;Task:
Given two hourglasshourglasses of   '''4'''   minutes and   '''7'''   minutes,   the task is to measure   '''9'''   minutes.
 
;Notes
 
;Notes:
Implemented as a 1-player game.
<br><br>
 
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">V t4 = 0
L t4 < 10'000
V t7_left = 7 - t4 % 7
I t7_left == 9 - 4
print(|‘Turn over both hour glasses at the same time and continue flipping them each
when they individually run down until the 4 hour glass is flipped #. times,
wherupon the 7 hour glass is immediately placed on its side with #. hours
of sand in it.
You can measure 9 hours by flipping the 4 hour glass once, then
flipping the remaining sand in the 7 hour glass when the 4 hour glass ends.
’.format(t4 I/ 4, t7_left))
L.break
t4 += 4
L.was_no_break
print(‘Not found’)</syntaxhighlight>
 
{{out}}
<pre>
Turn over both hour glasses at the same time and continue flipping them each
when they individually run down until the 4 hour glass is flipped 4 times,
wherupon the 7 hour glass is immediately placed on its side with 5 hours
of sand in it.
You can measure 9 hours by flipping the 4 hour glass once, then
flipping the remaining sand in the 7 hour glass when the 4 hour glass ends.
 
</pre>
=={{header|AWK}}==
<syntaxhighlight lang="awk">
# syntax: GAWK -f HOURGLASS_PUZZLE.AWK
BEGIN {
limit = 100
t4 = 0
while (t4 < limit) {
t7_left = 7 - t4 % 7
if (t7_left == 9 - 4) {
break
}
t4 += 4
}
if (t4 > limit) {
printf("Unable to find an answer within %d iterations\n",limit)
exit(1)
}
str = sprintf("Turn over both hour glasses at the same time and continue flipping them each " \
"when they individually run down until the 4 hour glass is flipped %d times, " \
"wherupon the 7 hour glass is immediately placed on its side with %d minutes " \
"of sand in it. " \
"You can measure 9 minutes by flipping the 4 hour glass once, then " \
"flipping the remaining sand in the 7 hour glass when the 4 hour glass ends.",t4/4,t7_left)
fold(str)
exit(0)
}
function fold(rec, chars_printed,indx,text) {
line_length = 80
while (1) {
indx = match(rec," ")
if (indx == 0) {
printf("%s\n",rec)
break
}
text = substr(rec,1,indx)
printf("%s",text)
rec = substr(rec,RSTART+1)
chars_printed += length(text)
if (chars_printed > line_length) {
printf("\n")
chars_printed = 0
}
}
}
</syntaxhighlight>
{{out}}
<pre>
Turn over both hour glasses at the same time and continue flipping them each when
they individually run down until the 4 hour glass is flipped 4 times, wherupon the
7 hour glass is immediately placed on its side with 5 minutes of sand in it. You
can measure 9 minutes by flipping the 4 hour glass once, then flipping the remaining
sand in the 7 hour glass when the 4 hour glass ends.
</pre>
 
=={{header|FreeBASIC}}==
{{trans|Phyton}}
<syntaxhighlight lang="freebasic">
Sub Hourglass_puzzle()
Dim As Uinteger t4 = 0, limite = 1000, t7_left
While t4 < limite
t7_left = 7 - t4 Mod 7
If t7_left = 9 - 4 Then Exit While
t4 += 4
Wend
If t4 > limite Then
Print "No encontrado"
Return
End If
Print Using !"\nVoltee al mismo tiempo ambos relojes de arena y contin£e volte ndolos \n" + _
!"cuando los relojes de arena se agoten individualmente, hasta que el \n" + _
!"reloj de arena de 4 minutos se voltee & veces, despu‚s de lo cual el \n" + _
!"reloj de 7 minutos se coloca inmediatamente de lado con & minutos de \n" + _
!"arena en ‚l. \n" + _
!"\nPuede medir 9 minutos volteando el reloj de 4 minutos una vez, luego \n" + _
!"volteando la arena restante en el reloj de 7 minutos cuando termine \n" + _
!"el reloj de 4 minutos."; t4/4; t7_left
End Sub
 
Hourglass_puzzle()
Sleep
</syntaxhighlight>
{{out}}
<pre>
Voltee al mismo tiempo ambos relojes de arena y continúe volteándolos
cuando los relojes de arena se agoten individualmente, hasta que el
reloj de arena de 4 minutos se voltee 4 veces, después de lo cual el
reloj de 7 minutos se coloca inmediatamente de lado con 5 minutos de
arena en él.
 
Puede medir 9 minutos volteando el reloj de 4 minutos una vez, luego
volteando la arena restante en el reloj de 7 minutos cuando termine
el reloj de 4 minutos.
</pre>
 
=={{header|Go}}==
{{trans|Julia}}
<langsyntaxhighlight lang="go">package main
 
import (
Line 73 ⟶ 199:
fmt.Println(ts[i], "using", hgs[i])
}
}</langsyntaxhighlight>
 
{{out}}
Line 88 ⟶ 214:
=={{header|Julia}}==
Implemented as a game solver rather than as a game with user input.
<langsyntaxhighlight lang="julia">function euclidean_hourglassflipper(hourglasses, target::Integer)
gcd(hourglasses) in hourglasses && !(1 in hourglasses) && throw("Hourglasses fail sanity test (not relatively prime enough)")
flippers, series = deepcopy(hourglasses), Int[]
Line 114 ⟶ 240:
i, j = euclidean_hourglassflipper([5, 7, 31], 36)
println("Use hourglasses from step $i to step $j (inclusive) to sum 36 using [5, 7, 31]")
</langsyntaxhighlight>{{out}}
<pre>
Flip an hourglass every time it runs out of grains, and note the interval in time.
Line 122 ⟶ 248:
Use hourglasses from step 5 to step 17 (inclusive) to sum 36 using [5, 7, 31]
</pre>
 
=={{header|Logo}}==
tested with FMSlogo
<syntaxhighlight lang="logo">
to bb
Make "small_capacity 4
Make "big_capacity 7
make "small 0
make "big 0
make "t 0
print "_____________decision_0_game_over
print "_________decision_1_start_timing
print "_______decision_2_flip_small
print "____decision_3_flip_big
print "__decision_4_flip_both
print "_________any_other_number________________wait
do.until [show list list :small :big :t print "your_decision_0_1_2_3_4 human_decision if :my_decision>1 [machine_computes] ] [:my_decision=0]
print list :t "minutes_passed
end
 
to human_decision
make "my_decision readword
if :my_decision=1 [print "reset_timer make "t 0]
if :my_decision=2 [print "flip_small make "small :small_capacity-:small]
if :my_decision=3 [print "flip_big make "big :big_capacity-:big]
if :my_decision=4 [print "flip_both make "small :small_capacity-:small make "big :big_capacity-:big ]
if :my_decision>4 [print "wait]
end
 
to machine_computes
ifelse :small>:big [make "my_selection :big] [make "my_selection :small]
if :small=0 [make "my_selection :big]
if :big=0 [make "my_selection :small]
make "small :small-:my_selection
make "big :big-:my_selection
make "t :t+:my_selection
if :small<0 [make "small 0]
if :big<0 [make "big 0]
end
 
to zzz
;A. 7 minutes with 4- and 5-minute timers
;B. 15 minutes with 7- and 11-minute timers
;C. 14 minutes with 5- and 8-minute timers
ifelse YesNoBox [Welcome] [run / show me the code] [bb] [edall]
;A is possible: Turn both the 5 and the 4. When the 4 runs out, flip it over.Now, when the 5 runs out, start timing. The 4 will run for three more minutes, after which, you can flip it over to reach 7.
;B is possible: Turn both the 7 and the 11. When the 7 runs out, start timing. The 11 will run for 4 more minutes, after which it can be flipped to reach 15.
;C is possible: Turn both the 5 and the 8. When the 5 runs out, flip it. The 8 will then run out after 3 minutes, leaving 2 minutes in the 5. Flip the 8 then. When the 5 runs out, start timing. There are now 6 minutes left in the 8, and flipping the 8 after those 6 minutes gives 6 + 8 = 14 minutes.
end
 
Make "big 0
Make "big_capacity 5
Make "my_decision "
Make "my_selection 4
Make "small 0
Make "small_capacity 4
Make "startup [zzz]
Make "t 0
 
 
</syntaxhighlight>
 
=={{header|Nim}}==
{{trans|Wren}}
<syntaxhighlight 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(" "))</syntaxhighlight>
 
{{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|Perl}}==
Flip each hourglass when it runs out and note the time for each.
<syntaxhighlight lang="perl">use strict;
<lang perl>#!/usr/bin/perl
 
use strict; # https://rosettacode.org/wiki/Hourglass_puzzle
use warnings;
use feature 'bitwise';
 
findinterval( $_, 4, 7 ) for 1 .. 20;
Line 135 ⟶ 364:
{
my ($want, $hour1, $hour2) = @_;
local $_ = (('1' |. ' ' x $hour1) x $hour2 | ('2' |. ' ' x $hour2) x $hour1) x $want;
print /(?=\d).{$want}(?=\d)/
? "To get $want minute@{[$want == 1 ? '' : 's'
]}, Start at time $-[0] and End at time $+[0]\n"
: "$want is not possible\n";
}</langsyntaxhighlight>
{{out}}
<pre>
Line 166 ⟶ 395:
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>-- demo\rosetta\Hourglass_puzzle.exw
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Hourglass_puzzle.exw</span>
procedure print_solution(sequence eggtimers, tries, integer target, pdx)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
sequence soln = {tries[$]}, remain
<span style="color: #008080;">procedure</span> <span style="color: #000000;">print_solution</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">target</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pdx</span><span style="color: #0000FF;">)</span>
integer n = length(eggtimers), tdx = tries[$][3], t, flipbits
<span style="color: #004080;">sequence</span> <span style="color: #000000;">soln</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">tries</span><span style="color: #0000FF;">[$]},</span> <span style="color: #000000;">remain</span>
string et = ""
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">tdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">[$][</span><span style="color: #000000;">3</span><span style="color: #0000FF;">],</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">flipbits</span>
for timer=1 to n do
<span style="color: #004080;">string</span> <span style="color: #000000;">et</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
if timer=n then et &= " and "
<span style="color: #008080;">for</span> <span style="color: #000000;">timer</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>
elsif timer>1 then et &= ", " end if
<span style="color: #008080;">if</span> <span style="color: #000000;">timer</span><span style="color: #0000FF;">=</span><span style="color: #000000;">n</span> <span style="color: #008080;">then</span> <span style="color: #000000;">et</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">" and "</span>
et &= sprintf("%d",eggtimers[timer])
<span style="color: #008080;">elsif</span> <span style="color: #000000;">timer</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">et</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">", "</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #000000;">et</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">])</span>
printf(1,"\nSolution for %d minutes with %s minute eggtimers:\n",{target,et})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
while tdx do
<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;">"\nSolution for %d minutes with %s minute eggtimers:\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">target</span><span style="color: #0000FF;">,</span><span style="color: #000000;">et</span><span style="color: #0000FF;">})</span>
if tdx=pdx then soln &= 0 end if
<span style="color: #008080;">while</span> <span style="color: #000000;">tdx</span> <span style="color: #008080;">do</span>
soln = append(soln,tries[tdx])
<span style="color: #008080;">if</span> <span style="color: #000000;">tdx</span><span style="color: #0000FF;">=</span><span style="color: #000000;">pdx</span> <span style="color: #008080;">then</span> <span style="color: #000000;">soln</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
tdx = tries[tdx][3]
<span style="color: #000000;">soln</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">soln</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tries</span><span style="color: #0000FF;">[</span><span style="color: #000000;">tdx</span><span style="color: #0000FF;">])</span>
end while
<span style="color: #000000;">tdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">[</span><span style="color: #000000;">tdx</span><span style="color: #0000FF;">][</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]</span>
soln = reverse(soln[1..$-1])
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
integer tp = 0, ro = 0
<span style="color: #000000;">soln</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">reverse</span><span style="color: #0000FF;">(</span><span style="color: #000000;">soln</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">])</span>
sequence premain = repeat(0,n)
<span style="color: #004080;">integer</span> <span style="color: #000000;">tp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">ro</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
for i=1 to length(soln) do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">premain</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>
if soln[i]=0 then
<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: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">soln</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
puts(1,"start timer\n")
<span style="color: #008080;">if</span> <span style="color: #000000;">soln</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
else
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"start timer\n"</span><span style="color: #0000FF;">)</span>
{remain,t,?,flipbits} = soln[i]
<span style="color: #008080;">else</span>
sequence flip = int_to_bits(flipbits,n)
<span style="color: #0000FF;">{</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,?,</span><span style="color: #000000;">flipbits</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">soln</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
string fs = "", lv = ""
<span style="color: #004080;">sequence</span> <span style="color: #000000;">flip</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">int_to_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">flipbits</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
for timer=1 to n do
<span style="color: #004080;">string</span> <span style="color: #000000;">fs</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">lv</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
if flip[timer] then
<span style="color: #008080;">for</span> <span style="color: #000000;">timer</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>
if length(fs) then fs &= " and " end if
<span style="color: #008080;">if</span> <span style="color: #000000;">flip</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
fs &= sprintf("%d",eggtimers[timer])
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fs</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #000000;">fs</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">" and "</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if premain[timer] then
<span style="color: #000000;">fs</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">])</span>
fs &= sprintf(" (leaving %d)",eggtimers[timer]-premain[timer])
<span style="color: #008080;">if</span> <span style="color: #000000;">premain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">fs</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" (leaving %d)"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">premain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">])</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if remain[timer]=0 then
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if flip[timer] or premain[timer]!=0 then
<span style="color: #008080;">if</span> <span style="color: #000000;">remain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
ro = eggtimers[timer]
<span style="color: #008080;">if</span> <span style="color: #000000;">flip</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">or</span> <span style="color: #000000;">premain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]!=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">ro</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span>
else
if length(lv)<span then lv &style="color: #008080;">end</span> and<span style="color: end #008080;">if</span>
<span lv &style= sprintf("%d incolor: %d#008080;",{remain[timer],eggtimers[timer]})>else</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lv</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #000000;">lv</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">" and "</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #000000;">lv</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"%d in %d"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">],</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]})</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
lv = iff(length(lv)?" (leaving "&lv&")":"")
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
printf(1,"At t=%d, flip %s, then when %d runs out%s...\n",{tp,fs,ro,lv})
<span style="color: #000000;">lv</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">lv</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">" (leaving "</span><span style="color: #0000FF;">&</span><span style="color: #000000;">lv</span><span style="color: #0000FF;">&</span><span style="color: #008000;">")"</span><span style="color: #0000FF;">:</span><span style="color: #008000;">""</span><span style="color: #0000FF;">)</span>
tp = t
<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;">"At t=%d, flip %s, then when %d runs out%s...\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">tp</span><span style="color: #0000FF;">,</span><span style="color: #000000;">fs</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ro</span><span style="color: #0000FF;">,</span><span style="color: #000000;">lv</span><span style="color: #0000FF;">})</span>
premain = remain
<span style="color: #000000;">tp</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">t</span>
end if
<span style="color: #000000;">premain</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">remain</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
printf(1,"At t=%d, stop timer\n",{tp})
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end procedure
<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;">"At t=%d, stop timer\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">tp</span><span style="color: #0000FF;">})</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
procedure solve(sequence eggtimers, integer target)
integer n = length(eggtimers), tdx = 1, t, pdx
<span style="color: #008080;">procedure</span> <span style="color: #000000;">solve</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">target</span><span style="color: #0000FF;">)</span>
sequence remain = repeat(0,n),
<span style="color: #004080;">integer</span> <span style="color: #000000;">n</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">tdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pdx</span>
tries = {{remain,0,0,0}} -- {{remain,t,link,flip}}
<span style="color: #004080;">sequence</span> <span style="color: #000000;">remain</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>
while tdx<=length(tries) do
<span style="color: #000000;">tries</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}}</span> <span style="color: #000080;font-style:italic;">-- {{remain,t,link,flip}}</span>
for flipbits=1 to power(2,n)-1 do
<span style="color: #008080;">while</span> <span style="color: #000000;">tdx</span><span style="color: #0000FF;"><=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tries</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
{remain,t} = tries[tdx]
<span style="color: #008080;">for</span> <span style="color: #000000;">flipbits</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">power</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2</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;">do</span>
sequence flip = int_to_bits(flipbits,n)
<span style="color: #0000FF;">{</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tries</span><span style="color: #0000FF;">[</span><span style="color: #000000;">tdx</span><span style="color: #0000FF;">])</span>
for timer=1 to n do
<span style="color: #004080;">sequence</span> <span style="color: #000000;">flip</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">int_to_bits</span><span style="color: #0000FF;">(</span><span style="color: #000000;">flipbits</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
if flip[timer] then
<span style="color: #008080;">for</span> <span style="color: #000000;">timer</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>
remain[timer] = eggtimers[timer]-remain[timer]
<span style="color: #008080;">if</span> <span style="color: #000000;">flip</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
end if
<span style="color: #000000;">remain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]-</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">[</span><span style="color: #000000;">timer</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
integer mr = min(filter(remain,">",0))
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
remain = sq_max(sq_sub(remain,mr),0)
<span style="color: #004080;">integer</span> <span style="color: #000000;">mr</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">filter</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"&gt;"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">))</span>
mr += t
<span style="color: #000000;">remain</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_max</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">sq_sub</span><span style="color: #0000FF;">(</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mr</span><span style="color: #0000FF;">),</span><span style="color: #000000;">0</span><span style="color: #0000FF;">)</span>
tries = append(tries,{remain,mr,tdx,flipbits})
<span style="color: #000000;">mr</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">t</span>
pdx = tdx
<span style="color: #000000;">tries</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tries</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">remain</span><span style="color: #0000FF;">,</span><span style="color: #000000;">mr</span><span style="color: #0000FF;">,</span><span style="color: #000000;">tdx</span><span style="color: #0000FF;">,</span><span style="color: #000000;">flipbits</span><span style="color: #0000FF;">})</span>
while pdx do
<span style="color: #000000;">pdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tdx</span>
mr -= tries[pdx][2]
<span style="color: #008080;">while</span> <span style="color: #000000;">pdx</span> <span style="color: #008080;">do</span>
if mr>=target then
<span style="color: #000000;">mr</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pdx</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span>
if mr>target then exit end if
<span style="color: #008080;">if</span> <span style="color: #000000;">mr</span><span style="color: #0000FF;">>=</span><span style="color: #000000;">target</span> <span style="color: #008080;">then</span>
print_solution(eggtimers, tries, target, pdx)
<span style="color: #008080;">if</span> <span style="color: #000000;">mr</span><span style="color: #0000FF;">></span><span style="color: #000000;">target</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return
<span style="color: #000000;">print_solution</span><span style="color: #0000FF;">(</span><span style="color: #000000;">eggtimers</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">target</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pdx</span><span style="color: #0000FF;">)</span>
end if
mr + <span style="color: tries[pdx][2]#008080;">return</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
pdx = tries[pdx][3]
<span style="color: #000000;">mr</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pdx</span><span style="color: #0000FF;">][</span><span style="color: #000000;">2</span><span style="color: #0000FF;">]</span>
end while
<span style="color: #000000;">pdx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">tries</span><span style="color: #0000FF;">[</span><span style="color: #000000;">pdx</span><span style="color: #0000FF;">][</span><span style="color: #000000;">3</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
tdx += 1
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
-- totally arbitrary sanity crash:
<span style="color: #000000;">tdx</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
if length(tries)>20000 then crash("no solution") end if
<span style="color: #000080;font-style:italic;">-- totally arbitrary sanity crash:</span>
end while
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tries</span><span style="color: #0000FF;">)></span><span style="color: #000000;">20000</span> <span style="color: #008080;">then</span> <span style="color: #7060A8;">crash</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"no solution"</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
solve({4,7},9)
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
solve({4,7},15)
<span style="color: #000000;">solve</span><span style="color: #0000FF;">({</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},</span><span style="color: #000000;">9</span><span style="color: #0000FF;">)</span>
solve({5,7,31},36) -- (slightly better output than Julia, I think...)
<span style="color: #000000;">solve</span><span style="color: #0000FF;">({</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">},</span><span style="color: #000000;">15</span><span style="color: #0000FF;">)</span>
solve({4,5},7) -- (logo solution stops timer at t=12, this manages t=11)
<span style="color: #000000;">solve</span><span style="color: #0000FF;">({</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">31</span><span style="color: #0000FF;">},</span><span style="color: #000000;">36</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (slightly better output than Julia, I think...)</span>
solve({7,11},15) -- (logo solution stops timer at t=22, this manages t=15)
<span style="color: #000000;">solve</span><span style="color: #0000FF;">({</span><span style="color: #000000;">4</span><span style="color: #0000FF;">,</span><span style="color: #000000;">5</span><span style="color: #0000FF;">},</span><span style="color: #000000;">7</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (logo solution stops timer at t=12, this manages t=11)</span>
solve({5,8},14) -- (logo solution stops timer at t=24, this manages t=19)</lang>
<span style="color: #000000;">solve</span><span style="color: #0000FF;">({</span><span style="color: #000000;">7</span><span style="color: #0000FF;">,</span><span style="color: #000000;">11</span><span style="color: #0000FF;">},</span><span style="color: #000000;">15</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (logo solution stops timer at t=22, this manages t=15)</span>
<span style="color: #000000;">solve</span><span style="color: #0000FF;">({</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span><span style="color: #000000;">8</span><span style="color: #0000FF;">},</span><span style="color: #000000;">14</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (logo solution stops timer at t=24, this manages t=19)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 304 ⟶ 536:
At t=19, stop timer
</pre>
 
=={{header|Logo}}==
tested with FMSlogo
<lang logo>
to bb
Make "small_capacity 4
Make "big_capacity 7
make "small 0
make "big 0
make "t 0
print "_____________decision_0_game_over
print "_________decision_1_start_timing
print "_______decision_2_flip_small
print "____decision_3_flip_big
print "__decision_4_flip_both
print "_________any_other_number________________wait
do.until [show list list :small :big :t print "your_decision_0_1_2_3_4 human_decision if :my_decision>1 [machine_computes] ] [:my_decision=0]
print list :t "minutes_passed
end
 
to human_decision
make "my_decision readword
if :my_decision=1 [print "reset_timer make "t 0]
if :my_decision=2 [print "flip_small make "small :small_capacity-:small]
if :my_decision=3 [print "flip_big make "big :big_capacity-:big]
if :my_decision=4 [print "flip_both make "small :small_capacity-:small make "big :big_capacity-:big ]
if :my_decision>4 [print "wait]
end
 
to machine_computes
ifelse :small>:big [make "my_selection :big] [make "my_selection :small]
if :small=0 [make "my_selection :big]
if :big=0 [make "my_selection :small]
make "small :small-:my_selection
make "big :big-:my_selection
make "t :t+:my_selection
if :small<0 [make "small 0]
if :big<0 [make "big 0]
end
 
to zzz
;A. 7 minutes with 4- and 5-minute timers
;B. 15 minutes with 7- and 11-minute timers
;C. 14 minutes with 5- and 8-minute timers
ifelse YesNoBox [Welcome] [run / show me the code] [bb] [edall]
;A is possible: Turn both the 5 and the 4. When the 4 runs out, flip it over.Now, when the 5 runs out, start timing. The 4 will run for three more minutes, after which, you can flip it over to reach 7.
;B is possible: Turn both the 7 and the 11. When the 7 runs out, start timing. The 11 will run for 4 more minutes, after which it can be flipped to reach 15.
;C is possible: Turn both the 5 and the 8. When the 5 runs out, flip it. The 8 will then run out after 3 minutes, leaving 2 minutes in the 5. Flip the 8 then. When the 5 runs out, start timing. There are now 6 minutes left in the 8, and flipping the 8 after those 6 minutes gives 6 + 8 = 14 minutes.
end
 
Make "big 0
Make "big_capacity 5
Make "my_decision "
Make "my_selection 4
Make "small 0
Make "small_capacity 4
Make "startup [zzz]
Make "t 0
 
 
</lang>
 
=={{header|Python}}==
There isn't much of a task description as I write this, but, here goes...
 
<langsyntaxhighlight lang="python">def hourglass_puzzle():
t4 = 0
while t4 < 10_000:
Line 388 ⟶ 559:
""")
hourglass_puzzle()</langsyntaxhighlight>
 
{{out}}
Line 399 ⟶ 570:
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" perl6line># 20201230 Raku programming solution
 
my @hourglasses = 4, 7;
Line 430 ⟶ 601:
}
 
.say if .defined for @output</langsyntaxhighlight>
{{out}}
<pre>At time t = 4 , flip hourglass 4
Line 441 ⟶ 612:
=={{header|REXX}}==
{{trans|Python}}
<langsyntaxhighlight lang="rexx">/*REXX program determines if there is a solution to measure 9 minutes using a */
/*──────────────────────────────────── four and seven minute sandglasses. */
t4= 0
Line 465 ⟶ 636:
say "glass when the four-minute glass ends."
say
exit 0</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the internal default input:}}
<pre>
Line 478 ⟶ 649:
glass when the four-minute glass ends.
</pre>
 
=={{header|V (Vlang)}}==
{{trans|go}}
<syntaxhighlight lang="v (vlang)">import arrays {sum, min}
fn hourglass_flipper(hourglasses []int, target int) (int, []int) {
mut flippers := hourglasses.clone()
 
mut series := []int{}
for _ in 0..10000 {
n := min<int>(flippers) or {flippers[0]}
series << n
for i in 0..flippers.len {
flippers[i] -= n
}
for i, flipper in flippers {
if flipper == 0 {
flippers[i] = hourglasses[i]
}
}
for start := series.len - 1; start >= 0; start-- {
if sum<int>(series[start..]) or {-1} == target {
return start, series
}
}
}
return 0, []int{}
}
fn main() {
print("Flip an hourglass every time it runs out of grains, ")
println("and note the interval in time.")
hgs := [[4, 7], [5, 7, 31]]
ts := [9, 36]
for i in 0..hgs.len {
start, series := hourglass_flipper(hgs[i], ts[i])
end := series.len - 1
println("\nSeries: $series")
print("Use hourglasses from indices $start to $end (inclusive) to sum ")
println("${ts[i]} using ${hgs[i]}")
}
}</syntaxhighlight>
{{out}}
<pre>Same as Go entry</pre>
 
=={{header|Wren}}==
{{trans|Julia}}
{{libheader|Wren-math}}
<langsyntaxhighlight ecmascriptlang="wren">import "./math" for Nums
 
var hourglassFlipper = Fn.new { |hourglasses, target|
Line 516 ⟶ 731:
System.write("Use hourglasses from indices %(start) to %(end) (inclusive) to sum ")
System.print("%(target) using %(hourglasses)")
}</langsyntaxhighlight>
 
{{out}}
9,476

edits