Launch rocket with countdown and acceleration in stdout: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(Add 8080 assembly)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(6 intermediate revisions by 5 users not shown)
Line 1:
{{draft task}}
{{draft task|Launch rocket with countdown and acceleration in stdout}}
 
;Task Description:
Simulate the countdown of a rocket launch from   '''5'''   down to   '''0'''   seconds,   and then display the moving, accelerating rocket on the standard output device as a simple ASCII art animation.
 
<br><br>
The task is to simulate the countdown of a rocket launch from 5 down to 0 seconds and then display the moving, accelerating rocket on the standard output device as a simple ASCII art animation.
 
=={{header|8080 Assembly}}==
Line 17:
In SIMH, the command <code>d clock 2000</code> might help.
 
<langsyntaxhighlight lang="8080asm"> org 100h
lxi d,rocket ; Clear screen and print rocket
mvi c,9
Line 100:
count: db ' _____ '
number: db '5 _____',13,'$'
newln: db 13,10,'$'</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">#define sky 32
dim as string rocket(1 to 7) = { " ^",_
" / " + chr(92),_
Line 149:
cls
dt = timer - t
wend</langsyntaxhighlight>
 
=={{header|Go}}==
Line 155:
<br>
...though my rocket is a bit fancier :)
<langsyntaxhighlight lang="go">package main
 
import (
Line 208:
}
}
}</langsyntaxhighlight>
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">rocket() = println(" /..\\\n |==|\n | |\n | |\n",
" | |\n /____\\\n | |\n |SATU|\n | |\n",
" | |\n /| | |\\\n / | | | \\\n /__|_|__|__\\\n /_\\/_\\\n")
Line 234:
 
testrocket()
</langsyntaxhighlight>{{out}}
<pre>
Countdown...T minus 5... 4... 3...
Line 252:
/_\/_\
</pre>
 
=={{header|Nim}}==
{{trans|Julia}}
Using <code>terminal</code> module from standard library rather the escape codes.
<syntaxhighlight lang="nim">import os, math, terminal
 
proc rocket() =
echo " /..\\\n |==|\n | |\n | |\n",
" | |\n /____\\\n | |\n |SATU|\n | |\n",
" | |\n /| | |\\\n / | | | \\\n /__|_|__|__\\\n /_\\/_\\\n"
 
proc exhaust() =
echo " *****"
 
proc countDown(secs: Natural) =
stdout.write "Countdown...T minus "
stdout.flushFile
for i in countdown(secs, 1):
stdout.write i, "... "
stdout.flushFile
os.sleep(1000)
stdout.write "LIFTOFF!"
stdout.flushFile
 
proc engineBurn(rows: Natural) =
echo '\n'
for i in 1..rows:
exhaust()
sleep (0.9^i * 1000).toInt
 
proc testRocket() =
eraseScreen()
rocket()
cursorUp(16)
countDown(5)
cursorDown(13)
engineBurn(30)
 
testRocket()</syntaxhighlight>
 
{{out}}
Same as Julia program output.
 
=={{header|Pascal}}==
Pascal includes the standard routine <tt>page</tt>.
However its specific behavior is implementation-defined, i. e. up to the compiler vendor.
''An'' implementation of <tt>page</tt> ''could'', for instance, translate into <tt>\014</tt> (ASCII form feed) or <tt>\033[2J\033[H</tt>, the ANSI escape sequence blanking the entire screen and moving the cursor to the upper left-hand corner.
If the terminal interprets them properly, the following <tt>program</tt> could satisfy the task’s requirements:
<syntaxhighlight lang="pascal">program launchRocketWithCountdownAndAccelerationOnOutput(output);
 
const
screenWidth = 80;
 
type
wholeNumber = 0..maxInt;
natural = 1..maxInt;
 
var
n: wholeNumber;
 
{
Pascal, as defined by ISO standard 7185, does not provide any
facilities to time actions. Nevertheless, most compiler vendors
invented their own `sleep` or `delay` procedures.
}
procedure sleep(n: natural);
begin
{ Yes, in Pascal an empty statement is valid. }
{ There is really nothing after `do`. }
for n := n downto 1 do
end;
 
procedure drawRocket(column: natural);
begin
{ `page` is shorthand for `page(output)`, }
{ as is `writeLn(…)` shorthand for `writeLn(output, …)`. }
page;
{ It should be an easy feat to adapt this to contain ASCII only. }
writeLn(' ':column, '🙮')
end;
 
{ === MAIN ============================================================= }
begin
for n := 5 downto 0 do
begin
drawRocket(1);
writeLn;
writeLn(n);
sleep(5318008)
end;
n := 1;
while n < screenWidth do
begin
n := round(n * 1.5);
sleep(58008);
drawRocket(n)
end
end.</syntaxhighlight>Note, conventionally main engines (liquid fuel) are ignited a few seconds prior liftoff and SRBs are ignited just at/before liftoff, so the graphical depiction of exhaust visible at T−5 is ''about'' accurate.
 
=={{header|Perl}}==
{{trans|Raku}}
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use Time::HiRes qw(sleep);
Line 328 ⟶ 427:
 
# clean up on exit, reset ANSI codes, scroll, re-show the cursor & clear screen
sub clean_up { print "\e[0m", ("\n")x50, "\e[H\e[J\e[?25h"; exit(0) }</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">-->
<lang Phix>sequence rocket = split("""
<span style="color: #004080;">sequence</span> <span style="color: #000000;">rocket</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">split</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"""
/\
/ /\
| / | \
| |
/ |/\ |\
/_|||/\|_\
/_||||_\
""","\n")
"""</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
 
integer lines = 0, l = 0, t = 5
<span style="color: #004080;">integer</span> <span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">10</span>
atom s = 1
<span style="color: #004080;">atom</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0.25</span>
 
while length(rocket) do
<span style="color: #008080;">while</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if t>0 then
<span style="color: #008080;">if</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">></span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
rocket[$] = sprintf("T minus %d...",t)
<span style="color: #000000;">rocket</span><span style="color: #0000FF;">[$]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"T minus %d... "</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
-- allow console resize during countdown:
<span style="color: #000080;font-style:italic;">-- allow console resize during countdown:</span>
lines = video_config()[VC_SCRNLINES]
<span style="color: #000000;">lines</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">video_config</span><span style="color: #0000FF;">()[</span><span style="color: #004600;">VC_SCRNLINES</span><span style="color: #0000FF;">]</span>
if l!=lines-7 then l = 0 end if
<span style="color: #008080;">if</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">!=</span><span style="color: #000000;">lines</span><span style="color: #0000FF;">-</span><span style="color: #000000;">7</span> <span style="color: #008080;">then</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
else
<span style="color: #008080;">else</span>
if l=1 then
<span style="color: #008080;">if</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
rocket = rocket[2..$]
<span style="color: #000000;">rocket</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rocket</span><span style="color: #0000FF;">[</span><span style="color: #000000;">2</span><span style="color: #0000FF;">..$]</span>
else
<span l -style="color: (length(rocket)#008080;">else</span>6)
<span style="color: #000000;">l</span> <span style="color: #0000FF;">-=</span> <span style="color: #0000FF;">(</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">)></span><span style="color: #000000;">6</span><span style="color: #0000FF;">)</span>
if length(rocket)<12 then
<span style="color: #008080;">if</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">12</span> <span style="color: #008080;">then</span>
rocket = append(rocket," ** ")
<span style="color: #000000;">rocket</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" ** "</span><span style="color: #0000FF;">)</span>
elsif length(rocket)=12 then
<span style="color: #008080;">elsif</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">)=</span><span style="color: #000000;">12</span> <span style="color: #008080;">then</span>
rocket = append(rocket," ")
<span style="color: #000000;">rocket</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" "</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
s = s*0.95
<span style="color: #000000;">s</span> <span style="color: #0000FF;">*=</span> <span style="color: #000000;">0.95</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if l=0 then
<span style="color: #008080;">if</span> <span style="color: #000000;">l</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span>
clear_screen()
<span style="color: #7060A8;">clear_screen</span><span style="color: #0000FF;">()</span>
cursor(NO_CURSOR)
<span style="color: #7060A8;">cursor</span><span style="color: #0000FF;">(</span><span style="color: #004600;">NO_CURSOR</span><span style="color: #0000FF;">)</span>
l = lines-7
<span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lines</span><span style="color: #0000FF;">-</span><span style="color: #000000;">7</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
position(l,1)
<span style="color: #7060A8;">position</span><span style="color: #0000FF;">(</span><span style="color: #000000;">l</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
puts(1,join(rocket,"\n"))
<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: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rocket</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">))</span>
sleep(s)
<span style="color: #7060A8;">sleep</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
t -= 1
<span style="color: #000000;">t</span> <span style="color: #0000FF;">-=</span> <span style="color: #000000;">1</span>
if t=0 then rocket = rocket[1..$-1] end if
<span style="color: #008080;">if</span> <span style="color: #000000;">t</span><span style="color: #0000FF;">=</span><span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">rocket</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rocket</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> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end while
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
cursor(BLOCK_CURSOR)</lang>
<span style="color: #7060A8;">cursor</span><span style="color: #0000FF;">(</span><span style="color: #004600;">BLOCK_CURSOR</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
 
=={{header|Racket}}==
Line 379 ⟶ 480:
{{trans|Go}}
 
<langsyntaxhighlight lang="racket">#lang racket
 
(define rocket #<<EOF
Line 411 ⟶ 512:
(print-rocket n)
(sleep (/ ms 1000))
(if (>= ms 40) (- ms 40) 0))</langsyntaxhighlight>
 
=={{header|Raku}}==
Line 422 ⟶ 523:
The motion is a little "notchy" as the vertical resolution in a terminal is rather low. Exits after the rocket leaves the visible area of the terminal. See the [https://github.com/thundergnat/rc/blob/master/img/rocket-perl6.gif example animated gif]
 
<syntaxhighlight lang="raku" perl6line>signal(SIGINT).tap: { cleanup() }
 
my ($rows,$cols) = qx/stty size/.words;
Line 489 ⟶ 590:
 
# clean up on exit, reset ANSI codes, scroll, re-show the cursor & clear screen
sub cleanup () { print "\e[0m", "\n" xx 50, "\e[H\e[J\e[?25h"; exit(0) }</langsyntaxhighlight>
 
{{out|Sample output}}
Line 496 ⟶ 597:
=={{header|REXX}}==
This REXX program hard-codes the name of the (OS) command to clear the terminal screen &nbsp; ('''CLS''').
<langsyntaxhighlight lang="rexx">/*REXX pgm does a countdown and then display the launching of a rocket (ASCII animation)*/
parse arg cntDown . /*obtain optional argument from the CL.*/
if cntDown=='' | cntDown=="," then cntDown= 5 /*Not specified? Then use the default.*/
Line 536 ⟶ 637:
/*──────────────────────────────────────────────────────────────────────────────────────*/
sky: do air; say; end /*air*/; return /*display the sky above the rocket. */
rocket: do ship=1 for rs; say left('', sw%2 - 5) @.ship; end /*ship*/; return</langsyntaxhighlight>
This REXX program makes use of &nbsp; '''SCRSIZE''' &nbsp; REXX program (or
BIF) which is used to determine the screen
Line 546 ⟶ 647:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">
use std::{thread, time};
 
Line 590 ⟶ 691:
}
 
</syntaxhighlight>
</lang>
 
=={{header|Wren}}==
{{trans|Go}}
<langsyntaxhighlight ecmascriptlang="wren">import "timer" for Timer
 
var rocket = "
Line 633 ⟶ 734:
Timer.sleep(ms)
ms = (ms >= 40) ? ms - 40 : 0
}</langsyntaxhighlight>
 
=={{header|zkl}}==
{{trans|Go}}
Uses ANSI terminal codes.
<langsyntaxhighlight lang="zkl">var [const] rocket=
#<<<
0'~
Line 669 ⟶ 770:
ms=(ms - 0.04).max(0); // 40 milliseconds faster than last time
}
}</langsyntaxhighlight>
{{out}}
<pre>
9,482

edits