Hourglass puzzle: Difference between revisions

m
m (moved perl/phix below logo/nim)
m (→‎{{header|Wren}}: Minor tidy)
 
(7 intermediate revisions by 7 users not shown)
Line 10:
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 75 ⟶ 199:
fmt.Println(ts[i], "using", hgs[i])
}
}</langsyntaxhighlight>
 
{{out}}
Line 90 ⟶ 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 116 ⟶ 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 127 ⟶ 251:
=={{header|Logo}}==
tested with FMSlogo
<langsyntaxhighlight lang="logo">
to bb
Make "small_capacity 4
Line 184 ⟶ 308:
 
 
</syntaxhighlight>
</lang>
 
=={{header|Nim}}==
{{trans|Wren}}
<langsyntaxhighlight Nimlang="nim">import math, strutils
 
func hourglassFlipper(hourglasses: openArray[int];
Line 217 ⟶ 341:
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(" "))</langsyntaxhighlight>
 
{{out}}
Line 231 ⟶ 355:
=={{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 241 ⟶ 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 272 ⟶ 395:
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #000080;font-style:italic;">-- demo\rosetta\Hourglass_puzzle.exw</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
Line 366 ⟶ 489:
<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>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 417 ⟶ 540:
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 436 ⟶ 559:
""")
hourglass_puzzle()</langsyntaxhighlight>
 
{{out}}
Line 447 ⟶ 570:
 
=={{header|Raku}}==
<syntaxhighlight lang="raku" perl6line># 20201230 Raku programming solution
 
my @hourglasses = 4, 7;
Line 478 ⟶ 601:
}
 
.say if .defined for @output</langsyntaxhighlight>
{{out}}
<pre>At time t = 4 , flip hourglass 4
Line 489 ⟶ 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 513 ⟶ 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 526 ⟶ 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 564 ⟶ 731:
System.write("Use hourglasses from indices %(start) to %(end) (inclusive) to sum ")
System.print("%(target) using %(hourglasses)")
}</langsyntaxhighlight>
 
{{out}}
9,476

edits