Loops/While
You are encouraged to solve this task according to the task description, using any language you may know.
Start an integer value at 1024. Loop while it is greater than 0. Print the value (with a newline) and divide it by two each time through the loop.
ActionScript
<lang actionscript> var i:int = 1024; while (i > 0) {
trace(i); i /= 2;
} </lang>
Ada
<lang ada> declare
I : Integer := 1024;
begin
while I > 0 loop Put_Line(Integer'Image(I)); I := I / 2; end loop;
end; </lang>
ALGOL 68
INT i := 1024; WHILE i > 0 DO print((i)); i := i OVER 2 OD
Output:
+1024 +512 +256 +128 +64 +32 +16 +8 +4 +2 +1
AWK
<lang awk>BEGIN {
v = 1024 while(v > 0) { print v v = int(v/2) }
}</lang>
BASIC
<lang qbasic>i = 1024 while i > 0
print i i = i / 2
wend</lang>
Befunge
84*:*> :v ^/2.:_@
C
<lang c>int i = 1024; while(i > 0) {
printf("%d\n", i); i /= 2;
}</lang>
C++
<lang cpp>int i = 1024; while(i > 0) {
std::cout << i << std::endl; i /= 2;
}</lang>
Alternatively, it can be done with for
:
<lang cpp>
for (int i = 1024; i>0; i /= 2)
std::cout << i << std::endl;
</lang> Indeed, in C++, <lang cpp> for (init; cond; update)
statement;
</lang> is equivalent to <lang cpp> {
init; while (cond) { statement; update; }
} </lang>
C#
<lang c>int i = 1024; while(i > 0){
System.Console.WriteLine(i); i /= 2;
}</lang>
ColdFusion
Remove the leading space from the line break tag.
With tags:
<cfset i = 1024 /> <cfloop condition="i GT 0"> #i#< br /> <cfset i /= 2 /> </cfloop>
With script:
<cfscript> i = 1024; while( i > 0 ) { writeOutput( i + "< br/ >" ); } </cfscript>
Common Lisp
<lang lisp>(setq i 1024) (loop while (> i 0) do
(print i) (setq i (floor i 2)))</lang>
D
<lang d>import std.stdio;
int i = 1024; void main() {
while(i > 0) { writefln("%s", i); i >>= 1; }
}</lang>
Forth
<lang forth>
: halving ( n -- ) begin dup 0 > while cr dup . 2/ repeat drop ; 1024 halving
</lang>
Factor
1024 [ dup 0 > ] [ dup . 2 /i ] [ drop ] while
Fortran
<lang fortran>
INTEGER :: i = 1024 DO WHILE (i > 0) WRITE(*,*) i i = i / 2 END DO
</lang>
Haskell
<lang haskell>
import Control.Monad main = loop 1024 where loop n = when (n > 0) (do print n loop (n `div` 2))
</lang>
Icon
<lang icon>
procedure main() local i i := 1024 while write(0 < (i := i / 2)) end
</lang>
J
J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:
<lang j>
,. <.@-:^:*^:a: 1024
</lang>
J does support loops for those times they can't be avoided (just like many languages support gotos for those time they can't be avoided).
<lang j>
3 : 0 ] 1024 while. 0 < y do. y 1!:2 ] 2 y =. <. -: y end. i. 0 0 )
</lang>
Though it's rare to see J code like this.
Java
<lang java>int i = 1024; while(i > 0){
System.out.println(i); i >>= 1; //also acceptable: i /= 2;
}</lang>
JavaScript
<lang javascript>var n = 1024; while (n>0) {
print(n); n/=2;
}</lang>
Logo
make "n 1024 while [:n > 0] [print :n make "n :n / 2]
MAXScript
a = 1024 while a > 0 do ( print a a /= 2 )
Make
NEXT=`expr $* / 2` MAX=10 all: $(MAX)-n; 0-n:; %-n: %-echo @-make -f while.mk $(NEXT)-n MAX=$(MAX) %-echo: @echo $*
Invoking it
|make -f while.mk MAX=1024
Modula-3
The usual module code and imports are omitted. <lang modula3>PROCEDURE DivBy2() =
VAR i: INTEGER := 1024; BEGIN WHILE i > 0 DO IO.PutInt(i); IO.Put("\n"); i := i DIV 2; END; END DivBy2;</lang>
Oberon-2
The usual module code and imports are ommited. <lang oberon2>PROCEDURE DivBy2*();
VAR i: INTEGER;
BEGIN
i := 1024; WHILE i > 0 DO Out.Int(i,0); Out.Ln; i := i DIV 2; END;
END DivBy2;</lang>
OCaml
<lang ocaml>let n = ref 1024;; while !n > 0 do
Printf.printf "%d\n" !n; n := !n / 2
done;;</lang>
But it is more common to write it in a tail-recursive functional style: <lang ocaml>let rec loop n =
if n > 0 then begin Printf.printf "%d\n" n; loop (n / 2) end
in loop 1024</lang>
Pascal
<lang pascal> program divby2(output);
var
i: integer;
begin
i := 1024; while i > 0 do begin writeln(i); i := i div 2 end
end. </lang>
Perl
<lang perl>$n = 1024; while ($n > 0) {
print "$n\n"; $n >>= 1; # also acceptable: use integer; $n /= 2;
}</lang>
PHP
<lang php>$i = 1024; while ($i > 0) {
echo "$i\n"; $i >>= 1;
}</lang>
Pop11
lvars i = 1024; while i > 0 do printf(i, '%p\n'); i div 2 -> i; endwhile;
Prolog
<lang prolog>while(0) :- !. while(X) :- write(X), nl, X1 is X // 2, while(X1).</lang>
Python
<lang python>n = 1024 while n > 0:
print n n //= 2</lang>
Ruby
<lang ruby>i = 1024 while i > 0 do
puts i i /= 2
end</lang>
Scheme
<lang scheme> (do ((n 1024 (quotient n 2)))
((<= n 0)) (display n) (newline))</lang>
Standard ML
<lang sml>val n = ref 1024; while !n > 0 do (
print (Int.toString (!n) ^ "\n"); n := !n div 2
)</lang>
But it is more common to write it in a tail-recursive functional style: <lang sml>let
fun loop n = if n > 0 then ( print (Int.toString n ^ "\n"); loop (n div 2) ) else ()
in
loop 1024
end</lang>
UnixPipes
(echo 1024>p.res;tail -f p.res) | while read a ; do test $a -gt 0 && (expr $a / 2 >> p.res ; echo $a) || exit 0 done
V
1024 [0 >] [ dup puts 2 / >int ] while
Visual Basic .NET
Dim x = 1024 Do Console.WriteLine(x) x = x \ 2 Loop While x > 0