Loops/While

From Rosetta Code
Revision as of 05:17, 7 January 2009 by rosettacode>Iswm
Task
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

<actionscript> var i:int = 1024; while (i > 0) {

   trace(i);
   i /= 2;

} </actionscript>

Ada

<ada> declare

  I : Integer := 1024;

begin

  while I > 0 loop
     Put_Line(Integer'Image(I));
     I := I / 2;
  end loop;

end; </ada>

BASIC

Works with: QuickBasic version 4.5

<qbasic>i = 1024 while i > 0

  print i
  i = i / 2

wend</qbasic>

Befunge

84*:*>   :v
     ^/2.:_@


C

<c>int i = 1024; while(i > 0) {

 printf("%d\n", i);
 i /= 2;

}</c>

C#

<c>int i = 1024; while(i > 0){

  System.Console.WriteLine(i);
  i /= 2;

}</c>

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

<lisp>(setq i 1024) (loop while (> i 0) do

 (print i)
 (setq i (floor i 2)))</lisp>

D

<D>import std.stdio;

int i = 1024; void main() {

   while(i > 0) {
       writefln("%s", i);
       i >>= 1;
   }

}</d>

Forth

: halving ( n -- )
  begin  dup 0 >
  while  cr dup .  2/
  repeat drop ;
1024 halving

Factor

 1024 [ dup 0 > ] [ dup . 2 /i ] [ drop ] while

Fortran

Works with: Fortran version 90 and later
INTEGER :: i = 1024
DO WHILE (i > 0)
  WRITE(*,*) i
  i = i / 2
END DO

Haskell

import Control.Monad
main = loop 1024      
  where loop n = when (n > 0)
                      (do print n
                          loop (n `div` 2))


Icon

procedure main()
   local i
   i := 1024
   while write(0 < (i := i / 2))
end

J

J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:

  ,. <.@-:^:*^:a: 1024

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).

  3 : 0 ] 1024

       while. 0 < y do.
            y 1!:2 ] 2
            y =. <. -: y 
       end.

      i. 0 0
  )

Though it's rare to see J code like this.

Java

<java>int i = 1024; while(i > 0){

  System.out.println(i);
  i >>= 1; //also acceptable: i /= 2;

}</java>

JavaScript

<javascript>var n = 1024; while (n>0) {

print(n);
n/=2;

}</javascript>

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

Oberon-2

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;

OCaml

<ocaml>let n = ref 1024;; while !n > 0 do

 Printf.printf "%d\n" !n;
 n := !n / 2

done;;</ocaml>

But it is more common to write it in a tail-recursive functional style: <ocaml>let rec loop n =

 if n > 0 then begin
   Printf.printf "%d\n" n;
   loop (n / 2)
 end

in loop 1024</ocaml>

Pascal

<pascal> program divby2(output);

var

 i: integer;

begin

 i := 1024;
 while i > 0 do
   begin
     writeln(i);
     i := i div 2
   end

end. </pascal>

Perl

<perl>$n = 1024; while ($n > 0) {

   print "$n\n";
   $n >>= 1; # also acceptable: use integer; $n /= 2;

}</perl>

PHP

<php>$i = 1024; while ($i > 0) {

  echo "$i\n";
  $i >>= 1;

}</php>

Pop11

lvars i = 1024;
while i > 0 do
    printf(i, '%p\n');
    i div 2 -> i;
endwhile;

Python

<python>n = 1024 while n > 0:

   print n
   n //= 2</python>

Ruby

i = 1024 while i > 0 do

  puts i
  i /= 2

end

Scheme

<scheme> (do ((n 1024 (quotient n 2)))

   ((<= n 0))
   (display n)
   (newline))</scheme>

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