Loops/While
From Rosetta Code
You are encouraged to solve this task according to the task description, using any language you may know.
[edit] 6502 Assembly
Code is called as a subroutine (i.e. JSR LoopsWhile). Specific OS/hardware routines for printing are left unimplemented.
LoopsWhile: PHA ;push accumulator onto stack
LDA #$00 ;the 6502 is an 8-bit processor
STA Ilow ;and so 1024 ($0400) must be stored in two memory locations
LDA #$04
STA Ihigh
WhileLoop: LDA Ilow
BNE NotZero
LDA Ihigh
BEQ EndLoop
NotZero: JSR PrintI ;routine not implemented
LSR Ihigh ;shift right
ROR Ilow ;rotate right
JMP WhileLoop
EndLoop: PLA ;restore accumulator from stack
RTS ;return from subroutine
[edit] ActionScript
var i:int = 1024;
while (i > 0) {
trace(i);
i /= 2;
}
[edit] Ada
declare
I : Integer := 1024;
begin
while I > 0 loop
Put_Line(Integer'Image(I));
I := I / 2;
end loop;
end;
[edit] ALGOL 68
Works with: ALGOL 68 version Revision 1 - no extensions to language used
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny
Works with: ELLA ALGOL 68 version Any (with appropriate job cards) - tested with release 1.8-8d
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
[edit] AmigaE
PROC main()
DEF i = 1024
WHILE i > 0
WriteF('\d\n', i)
i := i / 2
ENDWHILE
ENDPROC
[edit] AppleScript
AppleScript does not natively support a standard out. Use the Script Editor's Event Log as the output.
set i to 1024
repeat while i > 0
log i
set i to i / 2
end repeat
[edit] AutoHotkey
i = 1024
While (i > 0)
{
output = %output%`n%i%
i := Floor(i / 2)
}
MsgBox % output
[edit] AWK
BEGIN {
v = 1024
while(v > 0) {
print v
v = int(v/2)
}
}
[edit] BASIC
Works with: QuickBasic version 4.5
i = 1024
WHILE i > 0
PRINT i
i = i / 2
WEND
[edit] Befunge
84*:*> :v
^/2.:_@
[edit] C
int i = 1024;
while(i > 0) {
printf("%d\n", i);
i /= 2;
}
In for loop fashion:
int i;
for(i = 1024;i > 0; i/=2){
printf("%d\n", i);
}
[edit] C++
int i = 1024;
while(i > 0) {
std::cout << i << std::endl;
i /= 2;
}
Alternatively, it can be done with for:
for (int i = 1024; i>0; i /= 2)
std::cout << i << std::endl;
Indeed, in C++,
for (init; cond; update)
statement;
is equivalent to
{
init;
while (cond)
{
statement;
update;
}
}
[edit] C#
int i = 1024;
while(i > 0){
System.Console.WriteLine(i);
i /= 2;
}
[edit] Clojure
(while (> @i 0)
(println @i)
(dosync (ref-set i (quot @i 2))))
[edit] 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>
[edit] Common Lisp
(setq i 1024)
(loop while (> i 0) do
(print i)
(setq i (floor i 2)))
[edit] D
import std.stdio;
int i = 1024;
void main() {
while(i > 0) {
writefln("%s", i);
i >>= 1;
}
}
[edit] E
var i := 1024
while (i > 0) {
println(i)
i //= 2
}
[edit] Factor
1024 [ dup 0 > ] [ dup . 2 /i ] while drop
[edit] FALSE
1024[$0>][$."
"2/]#%
[edit] Forth
: halving ( n -- )
begin dup 0 >
while cr dup . 2/
repeat drop ;
1024 halving
[edit] Fortran
Works with: Fortran version 90 and later
INTEGER :: i = 1024
DO WHILE (i > 0)
WRITE(*,*) i
i = i / 2
END DO
[edit] Go
i := 1024
for i > 0 {
fmt.Printf("%d\n", i)
i /= 2
}
[edit] Haskell
import Control.Monad (when)
main = loop 1024
where loop n = when (n > 0)
(do print n
loop (n `div` 2))
You could try to write a "while" that operates on monads:
import Control.Monad (when)
whileM :: (Monad m) => m Bool -> m a -> m ()
whileM cond body = do c <- cond
when c (body >> whileM cond body)
You can use it like this
import Data.IORef
main :: IO ()
main = do r <- newIORef 1024
whileM (do n <- readIORef r
return (n > 0))
(do n <- readIORef r
print n
modifyIORef r (`div` 2))
[edit] Icon and Unicon
[edit] Icon
procedure main()
local i
i := 1024
while write(0 < (i := i / 2))
end
[edit] Unicon
This Icon solution works in Unicon.
[edit] 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).
monad define 1024
while. 0 < y do.
smoutput y
y =. <. -: y
end.
i.0 0
)
Note: this defines an anonymous function (monad define, and the subsequent lines) and passes it the argument 1024, which means it will be executed as soon as the full definition is available.
[edit] Java
int i = 1024;
while(i > 0){
System.out.println(i);
i >>= 1; //also acceptable: i /= 2;
}
With a for loop:
for(int i = 1024; i > 0;i /= 2 /*or i>>= 1*/){
System.out.println(i);
}
[edit] JavaScript
var n = 1024;
while (n>0) {
print(n);
n/=2;
}
[edit] Joy
DEFINE putln == put '\n putch.
1024 [0 >] [dup putln 2 /] while.
[edit] Lisaac
+ i : INTEGER;
i := 1024;
{ i > 0 }.while_do {
i.print;
'\n'.print;
i := i / 2;
};
[edit] Logo
make "n 1024
while [:n > 0] [print :n make "n :n / 2]
[edit] Lua
n = 1024
while n>0 do
print(n)
n = math.floor(n/2)
end
[edit] Mathematica
Mathematica does not support integer-rounding, it would result in getting fractions: 1/2, 1/4 , 1/8 and so on; the loop would take infinite time without using the Floor function:
i = 1024;
While[i > 0,
Print[i];
i = Floor[i/2];
]
[edit] MATLAB
In Matlab (like Octave) the math is done floating point, then rounding to integer, so that 1/2 will be always 1 and never 0. A 'floor' is used to round the number.
i = 1024;
while (i > 0)
disp(i);
i = floor(i/2);
end
[edit] MAXScript
a = 1024
while a > 0 do
(
print a
a /= 2
)
[edit] 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
[edit] Metafont
Metafont has no while loop, but it can be "simulated" easily.
a := 1024;
forever: exitif not (a > 0);
show a;
a := a div 2;
endfor
[edit] MIRC Scripting Language
alias while_loop {
var %n = 10
while (%n >= 0) {
echo -a Countdown: %n
dec %n
}
}
[edit] Modula-3
The usual module code and imports are omitted.
PROCEDURE DivBy2() =
VAR i: INTEGER := 1024;
BEGIN
WHILE i > 0 DO
IO.PutInt(i);
IO.Put("\n");
i := i DIV 2;
END;
END DivBy2;
[edit] MOO
i = 1024;
while (i > 0)
player:tell(i);
i /= 2;
endwhile
[edit] Nimrod
var n: int = 1024
while n > 0:
echo(n)
n = n div 2
[edit] Oberon-2
The usual module code and imports are ommited.
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;
[edit] Objeck
i := 1024;
while(i > 0) {
i->PrintLine();
i /= 2;
};
[edit] OCaml
let n = ref 1024;;
while !n > 0 do
Printf.printf "%d\n" !n;
n := !n / 2
done;;
But it is more common to write it in a tail-recursive functional style:
let rec loop n =
if n > 0 then begin
Printf.printf "%d\n" n;
loop (n / 2)
end
in loop 1024
[edit] Octave
i = 1024;
while (i > 0)
disp(i)
i = floor(i/2);
endwhile
The usage of the type int32 is not convenient, since the math is done floating point, then rounding to integer, so that 1/2 will be always 1 and never 0.
[edit] Oz
Oz' for-loop can be used in a C-like manner:
for I in 1024; I>0; I div 2 do
{Show I}
end
Alternatively, we can use the while feature of the for-loop with a mutable variable:
declare
I = {NewCell 1024}
in
for while:@I > 0 do
{Show @I}
I := @I div 2
end
[edit] Pascal
program divby2(output);
var
i: integer;
begin
i := 1024;
while i > 0 do
begin
writeln(i);
i := i div 2
end
end.
[edit] Perl
my $n = 1024;
while ($n) {
print "$n\n";
$n = int $n / 2;
}
until (condition) is equivalent to while (not condition).
my $n = 1024;
until ($n <= 0) {
print "$n\n";
$n = int $n / 2;
}
[edit] Perl 6
Note that +> is the Perl 6 right bit-shift operator, it is equivalent to dividing by two. The + indicates that it is a numeric operation, and the > indicates that it is the right bit-shift operation since the tag is pointing to the right.
my $n = 1024*2;
say $n while ($n +>= 1) != 0;
Here is a solution without the restraints:
say 1024 +> $_ for 0..10;
And here's how you'd really write it, using a series operator that intuits the division for you:
for 1024, 512, 256 ... 1 { .say }
[edit] PHP
$i = 1024;
while ($i > 0) {
echo "$i\n";
$i >>= 1;
}
[edit] PicoLisp
(let N 1024
(while (gt0 N)
(println N)
(setq N (/ N 2)) ) )
[edit] Pike
int main(){
int i = 1024;
while(i > 0){
write(i + "\n");
i = i / 2;
}
}
[edit] PL/I
declare i fixed binary initial (1024);
do while (i>0);
put skip list (i);
i = i / 2;
end;
[edit] Pop11
lvars i = 1024;
while i > 0 do
printf(i, '%p\n');
i div 2 -> i;
endwhile;
[edit] PowerShell
$i = 1024
while ($i -gt 0) {
$i
$i /= 2
}
Since PowerShell automatically converts variables to other types to accommodate for operations the above loop does not stop at 1 like it would in other languages but loops for quite a while until the value is small enough to be considered 0. An explicit cast corrects this:
$i = 1024
while ($i -gt 0) {
$i
[int]$i /= 2
}
[edit] Prolog
while(0) :- !.
while(X) :- X>0,write(X), nl, X1 is X // 2, while(X1).
[edit] PureBasic
If OpenConsole()
x.i = 1024
While x > 0
PrintN(Str(x))
x / 2
Wend
Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
Input()
CloseConsole()
EndIf
[edit] Python
n = 1024
while n > 0:
print n
n //= 2
[edit] R
i <- 1024L
while(i > 0)
{
print(i)
i <- i %/% 2
}
[edit] REBOL
rebol [
Title: "Loop/While"
Author: oofoe
Date: 2009-12-19
URL: http://rosettacode.org/wiki/Loop/While
]
value: 1024
while [value > 0][
print value
value: to-integer value / 2
]
[edit] REXX
Using integer division % here:
i = 1024
do while i > 0
say i
i = i % 2
end
[edit] Ruby
i = 1024
while i > 0 do
puts i
i /= 2
end
The above can be written in one statement (using the return value of the Kernel#puts method: nil is false), but the readability suffers:
i = 1024
puts i or i /= 2 while i > 0
until condition is equivalent to while not condition.
i = 1024
until i <= 0 do
puts i
i /= 2
end
[edit] Sather
class MAIN is
main is
i ::= 1024;
loop while!(i > 0);
#OUT + i + "\n";
i := i / 2;
end;
end;
end;
[edit] Scala
var i = 1024
while (i > 0) {
println(i)
i /= 2
}
[edit] Scheme
(do ((n 1024 (quotient n 2)))
((<= n 0))
(display n)
(newline))
[edit] Seed7
$ include "seed7_05.s7i";
const proc: main is func
local
var integer: i is 1024;
begin
while i > 0 do
writeln(i);
i := i div 2
end while;
end func;
[edit] Slate
[| n | n: 1024.
[n isPositive] whileTrue:
[inform: number printString.
n: n // 2]] do
[edit] Smalltalk
number := 1024.
[ number > 0 ] whileTrue:
[ Transcript print: number; nl.
number := number // 2 ]
[edit] Standard ML
val n = ref 1024;
while !n > 0 do (
print (Int.toString (!n) ^ "\n");
n := !n div 2
)
But it is more common to write it in a tail-recursive functional style:
let
fun loop n =
if n > 0 then (
print (Int.toString n ^ "\n");
loop (n div 2)
) else ()
in
loop 1024
end
[edit] Suneido
i = 1024
while (i > 0)
{
Print(i)
i = (i / 2).Floor()
}
Output:
1024
512
256
128
64
32
16
8
4
2
1
[edit] Tcl
set i 1024
while {$i > 0} {
puts $i
set i [expr {$i / 2}]
}
[edit] TI-89 BASIC
Local i
1024 → i
While i > 0
Disp i
intDiv(i, 2) → i
EndWhile
[edit] Trith
1024 [dup print 2 / floor] [dup 0 >] while drop
1024 [dup print 1 shr] [dup 0 >] while drop
[edit] Unicon
See Icon.
[edit] UNIX Shell
Works with: Bourne Again SHell
x=1024
while [[ $x -gt 0 ]]; do
echo $x
x=$(( $x/2 ))
done
[edit] 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
[edit] Ursala
Unbounded iteration is expressed with the -> operator. An expression (p-> f) x, where p is a predicate and f is a function, evaluates to x, f(x), or f(f(x)), etc. as far as necessary to falsify p.
Printing an intermediate result on each iteration is a bigger problem because side effects are awkward. Instead, the function g in this example iteratively constructs a list of results, which is displayed on termination.
The argument to g is the unit list <1024>. The predicate p is ~&h, the function that tests whether the head of a list is non-null (equivalent to non-zero). The iterated function f is that which conses the truncated half of the head of its argument with a copy of the whole argument. The main program takes care of list reversal and formatting.
#import nat
g = ~&h-> ^C/half@h ~&
#show+
main = %nP*=tx g <1024>
output:
1024 512 256 128 64 32 16 8 4 2 1
Explicit iteration has its uses but there are always alternatives. The same output is produced by the following main program using bit manipulation.
main = %nP*=tK33 1024
[edit] V
1024 [0 >] [
dup puts
2 / >int
] while
[edit] Vedit macro language
#1 = 1024
while (#1 > 0) {
Num_Type(#1)
#1 /= 2
}
or with for loop:
for (#1 = 1024; #1 > 0; #1 /= 2) {
Num_Type(#1)
}
[edit] Visual Basic .NET
Dim x = 1024
Do
Console.WriteLine(x)
x = x \ 2
Loop While x > 0

