Loops/Do-while
You are encouraged to solve this task according to the task description, using any language you may know.
Start with a value at 0. Loop while value mod 6 is not equal to 0. Each time through the loop, add 1 to the value then print it. The loop must execute at least once.
[edit] 6502 Assembly
Code is called as a subroutine (i.e. JSR DoWhileSub). Specific OS/hardware routines for printing are left unimplemented.
DoWhileSub: PHA
TYA
PHA ;push accumulator and Y register onto stack
LDY #0
DoWhileLoop: INY
JSR DisplayValue ;routine not implemented
TYA
SEC
Modulus: SBC #6
BCS Modulus
ADC #6
BNE DoWhileLoop
PLA
TAY
PLA ;restore Y register and accumulator from stack
RTS ;return from subroutine
[edit] ActionScript
var val:int = 0;
do
{
trace(++val);
} while (val % 6);
[edit] Ada
loop
Value := Value + 1;
Put (Value);
exit when Value mod 6 = 0;
end loop;
Here is an alternative version:
for Value in 0..Integer'Last loop
Put (Value);
exit when Value mod 6 = 0;
end loop;
[edit] Aime
integer a;
a = 0;
do {
a += 1;
o_integer(a);
o_byte('\n');
} while (a % 6 != 0);
[edit] ALGOL 68
FOR value WHILE
print(value);
# WHILE # value MOD 6 /= 0 DO
SKIP
OD
[edit] AmigaE
PROC main()
DEF i = 0
REPEAT
i := i + 1
WriteF('\d\n', i)
UNTIL Mod(i, 6) = 0
ENDPROC
[edit] AutoHotkey
While mod(A_Index, 6) ;comment:everything but 0 is considered true
output = %output%`n%A_Index%
MsgBox % output
[edit] AWK
BEGIN {
val = 0
do {
val++
print val
} while( val % 6 != 0)
}
[edit] BASIC
a = 0
DO
a = a + 1
PRINT a
LOOP WHILE a MOD 6 <> 0
[edit] BBC BASIC
a = 0
REPEAT
a = a + 1
PRINT a
UNTIL a MOD 6 = 0
[edit] bc
i = 0
for (;;) {
++i /* increments then prints i */
if (i % 6 == 0) break
}
quit
[edit] Befunge
0>1+:.v
|%6: <
@
[edit] C
int val = 0;
do{
val++;
printf("%d\n",val);
}while(val % 6 != 0);
[edit] C++
int val = 0;
do{
val++;
cout << val << endl;
}while(val % 6 != 0);
[edit] C#
int a = 0;
do
{
Console.WriteLine(a);
a += 1;
} while (a % 6 != 0);
[edit] CoffeeScript
CoffeeScript doesn't have do {} while () loop, but it can be emulated using loop statement and break unless statement.
val = 0
loop
console.log ++val
break unless val % 6
[edit] ColdFusion
<cfscript>
value = 0;
do
{
value += 1;
writeOutput( value );
} while( value % 6 != 0 );
</cfscript>
[edit] Common Lisp
(setq val 0)
(loop do
(incf val)
(print val)
while (/= 0 (mod val 6)))
loop can set up temporary values, and incf returns a value, so it's also possible to do
(loop with val = 0
do (print (incf val))
until (= 0 (mod val 6)))
[edit] Clojure
(loop [i 0]
(let [i* (inc i)]
(println i*)
(when-not (zero? (mod i* 6))
(recur i*))))
[edit] D
import std.stdio;
void main() {
int val;
do {
val++;
write(val, " ");
} while (val % 6 != 0);
}
Output:
1 2 3 4 5 6
[edit] dc
0 si [i = 0]sz
[2Q]sA [A = code to break loop]sz
[
li 1 + p [print it = i + 1]sz
d si [i = it, leave it on stack]sz
6 % 0 =A [call A if 0 == it % 6]sz
0 0 =B [continue loop]sz
]sB 0 0 =B
[edit] Delphi
program Loop;
{$APPTYPE CONSOLE}
var
I: Integer;
begin
I:= 0;
repeat
Inc(I);
Write(I:2);
until I mod 6 = 0;
Writeln;
Readln;
end.
[edit] DWScript
var i := 0;
repeat
Inc(i);
PrintLn(i);
until i mod 6 = 0;
[edit] E
E does not have an official do-while construct, but the primitive which loops are built out of (which calls a function which returns a boolean indicating whether it should be called again) can be used to construct a do-while.
var x := 0
__loop(fn {
x += 1
println(x)
x % 6 != 0 # this is the return value of the function
})
[edit] Ela
open console
loop n | n % 6 == 0 = out ()
| else = out `seq` loop (n+1)
where out = & writen n
This implementation uses a thunk to represent a console output. Output is not done in the initialization of 'out' variable, it is done when 'out' calculation is forced by a 'seq' operator (sequencing operator).
[edit] Erlang
do() ->
io:format("0~n"),
do(1).
do(N) when N rem 6 =:= 0 ->
io:format("~w~n", [N]);
do(N) ->
io:format("~w~n", [N]),
do(N+1).
[edit] Factor
0 [ dup 6 mod 0 = not ] [ [ . ] [ 1 + ] bi ] do while drop
[edit] Fantom
There is no do-while statement in Fantom, so instead use an infinite while loop with a break statement:
class Main
{
public static Void main ()
{
i := 0
while (true)
{
i += 1
echo (i)
if (i % 6 == 0) break // end loop on condition
}
}
}
[edit] Forth
: do-until
0
begin 1+
dup .
dup 6 mod 0=
until
drop ;
[edit] Fortran
INTEGER :: i = 0
DO
i = i + 1
WRITE(*, *) i
IF (MOD(i, 6) == 0) EXIT
END DO
PROGRAM DOWHILE
C Initialize modulus and value.
INTEGER MODLUS, IVALUE
PARAMETER (MODLUS = 6)
IVALUE = 0
C FORTRAN 77 has no do-while structure -- not semantically. It is not
C difficult to simulate it using GOTO, however:
10 CONTINUE
IVALUE = IVALUE + 1
WRITE (*,*) IVALUE
IF (.NOT. (MOD(IVALUE, MODLUS) .EQ. 0)) GOTO 10
STOP
END
[edit] Go
No do-while in Go.
package main
import "fmt"
func main() {
for value := 0;; {
value++
fmt.Println(value)
if value % 6 == 0 {
break
}
}
}
Output:
1 2 3 4 5 6
[edit] GML
i = 0
do
{
i += 1
show_message(string(i))
}
until (i mod 6 = 0)
[edit] Groovy
Groovy does not have a bottom-checking loop construct! So use an "infinite" while loop with a conditional break as the last statement
def i = 0
while (true) {
i++
println i
if ( i % 6 == 0) break
}
Output:
1 2 3 4 5 6
[edit] Haskell
import Data.List
import Control.Monad
import Control.Arrow
doWhile p f n = (n:) $ takeWhile p $ unfoldr (Just.(id &&& f)) $ succ n
Example executed in GHCi:
*Main> mapM_ print $ doWhile ((/=0).(`mod`6)) succ 0
0
1
2
3
4
5
[edit] Icon and Unicon
Icon and Unicon do not have a do-while looping control with end of loop checking. There are four looping controls 'every', 'repeat', 'until', and 'while' (see Introduction to Icon and Unicon/Looping Controls for more information.)
procedure main()
i := 0
repeat {
write(i +:= 1)
if i % 6 = 0 then break
}
end
[edit] J
J is array-oriented, so there is very little need for loops. For example, one could satisfy this task this way:
,. ([^:(0=6|])>:)^:a: 0
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 ] 0
NB. The 'st' in 'whilst' stands for 'skip test'
whilst. 0 ~: 6 | y do.
y 1!:2 ]2
y =. y+1
end.
i.0 0
)
Though it's rare to see J code like this.
[edit] Java
int val = 0;
do{
val++;
System.out.println(val);
}while(val % 6 != 0);
[edit] JavaScript
var val = 0;
do {
print(++val);
} while (val % 6);
[edit] LabVIEW
This image is a VI Snippet, an executable image of LabVIEW code. The LabVIEW version is shown on the top-right hand corner. You can download it, then drag-and-drop it onto the LabVIEW block diagram from a file browser, and it will appear as runnable, editable code.
[edit] Liberty BASIC
a = 0
do
a =a +1
print a
loop until ( a mod 6) = 0
[edit] Lisaac
+ val : INTEGER;
{
val := val + 1;
val.print;
'\n'.print;
val % 6 != 0
}.while_do { };
[edit] Lua
Lua doesn't have a do .. while construct.
i=0
repeat
i=i+1
print(i)
until i%6 == 0
[edit] Logo
make "val 0
do.while [make "val :val + 1 print :val] [notequal? 0 modulo :val 6]
do.until [make "val :val + 1 print :val] [equal? 0 modulo :val 6]
to my.loop :n
make "n :n + 1
print :n
if notequal? 0 modulo :n 6 [my.loop :n]
end
my.loop 0
[edit] Maple
val := 0:
do
val := 1 + val;
print( val );
if irem( val, 6 ) = 0 then
break
end if;
end do:
[edit] Mathematica
value = 5;
NestWhile[
# + 1 &
,
value
, (Print[#]; Mod[#, 6] != 0) &
];
gives back:
5
6
If the starting value is 6, only 6 is returned.
[edit] MATLAB / Octave
a=0;
while (1)
a = a+1;
disp(a);
if (~mod(a,6)) break; end;
end;
[edit] Maxima
block([n: 0], do (ldisp(n: n + 1), if mod(n, 6) = 0 then return('done)))$
[edit] MAXScript
a = 0
do
(
print a
a += 1
)
while mod a 6 != 0
[edit] Metafont
Metafont has no a do-while construct; the same thing can be done using a forever loop and exitif.
a := 0;
forever: show a; a := a + 1; exitif a mod 6 = 0; endfor
end
[edit] МК-61/52
0 П4 КИП4 ИП4 6 / {x} x=0 02 С/П
[edit] Modula-2
MODULE DoWhile;
IMPORT InOut;
VAR
i: INTEGER;
BEGIN
i := 0
REPEAT
InOut.WriteInt(i, 1);
InOut.WriteLn;
INC(i)
UNTIL i MOD 6 = 0;
END DoWhile.
[edit] Modula-3
This is very similar to the Modula-2 code above.
REPEAT
i := i + 1;
IO.Put(Fmt.Int(i));
UNTIL i MOD 6 = 0;
[edit] Nemerle
mutable x = 0;
do
{
x++;
WriteLine($"$x");
} while (x % 6 != 0)
[edit] NetRexx
In NetRexx the do–while construct is implemented via the until expru conditional clause of the loop instruction. The expression expru in the until expru clause is evaluated at the end of the loop, guaranteeing that the loop will be executed at least once.
/* NetRexx */
options replace format comments java crossref savelog symbols nobinary
say
say 'Loops/Do-while'
i_ = 0
loop until i_ // 6 = 0
i_ = i_ + 1
say i_
end
[edit] OCaml
OCaml doesn't have a do-while loop, so we can just make a local loop:
let rec loop i =
let i = succ i in
Printf.printf "%d\n" i;
if i mod 6 <> 0 then
loop i
in
loop 0
or implementing a generic do-while iterator with higher order function:
let do_while f p =
let rec loop() =
f();
if p() then loop()
in
loop()
(** val do_while : (unit -> 'a) -> (unit -> bool) -> unit *)
let v = ref 0 in
do_while (fun () -> incr v; Printf.printf "%d\n" !v)
(fun () -> !v mod 6 <> 0)
The example above is the an imperative form, below is its functional counterpart:
let do_while f p ~init =
let rec loop v =
let v = f v in
if p v then loop v
in
loop init
do_while (fun v ->
let v = succ v in
Printf.printf "%d\n" v;
(v))
(fun v -> v mod 6 <> 0)
~init:0
Or in a very poor OCaml style, we can use an exception to exit a while loop:
let v = ref 0
exception Exit_loop
try while true do
incr v;
Printf.printf "%d\n" !v;
if not(!v mod 6 <> 0) then
raise Exit_loop;
done
with Exit_loop -> ()
[edit] Objeck
i := 0;
do {
i += 1;
i->PrintLine();
}
while (i % 6 <> 0);
[edit] Octave
The do-while can be changed into a do-until, just negating the condition of the while.
val = 0;
do
val++;
disp(val)
until( mod(val, 6) == 0 )
[edit] Openedge/Progress
DEFINE VARIABLE ii AS INTEGER.
DO WHILE ii MODULO 6 <> 0 OR ii = 0:
ii = ii + 1.
MESSAGE ii VIEW-AS ALERT-BOX.
END.
[edit] Oz
Normal Oz variables are single-assignment only. So we use a "cell", which is a one-element mutable container.
declare
I = {NewCell 0}
in
for until:@I mod 6 == 0 do
I := @I + 1
{Show @I}
end
[edit] PARI/GP
The generic Pari loops (while, until) test at the beginning, so just use an infinite loop with a break.
x = 0;
while(1,
print(x++);
if(val % 6 == 0, break)
)
[edit] Pascal
program countto6(output);
var
i: integer;
begin
i := 0;
repeat
i := i + 1;
writeln(i)
until i mod 6 = 0
end.
[edit] Perl
my $val = 0;
do {
$val++;
print "$val\n";
} while ($val % 6);
do ... until (condition) is equivalent to do ... while (not condition).
my $val = 0;
do {
$val++;
print "$val\n";
} until ($val % 6 == 0);
[edit] Perl 6
my $val = 0;
repeat {
say ++$val;
} while $val % 6;
repeat ... until condition is equivalent to do ... while not condition.
my $val = 0;
repeat {
say ++$val;
} until $val %% 6;
(Here we've used %%, the "divisible-by" operator.)
You can also put the condition before the block, without changing the order of evaluation.
my $val = 0;
repeat while $val % 6 {
say ++$val;
}
[edit] PHP
$val = 0;
do {
$val++;
print "$val\n";
} while ($val % 6 != 0);
[edit] PicoLisp
Literally:
(let Val 0
(loop
(println (inc 'Val))
(T (=0 (% Val 6))) ) )
Shorter:
(let Val 0
(until (=0 (% (println (inc 'Val)) 6))) )
or:
(for (Val 0 (n0 (% (println (inc 'Val)) 6))))
[edit] Pike
int main(){
int value = 0;
do {
value++;
write(value + "\n");
} while (value % 6);
}
[edit] PL/I
dcl value fixed bin (31) init (0);
do forever;
value = value + 1;
if mod(value, 6) = 0 then
leave;
put list (value);
end;
or shorter:
dcl value fixed bin(31) init(0);
do Until(value=6);
value+=1;
put Skip list(value);
end;
Output:
1
2
3
4
5
6
[edit] Pop11
lvars val = 0;
while true do
val + 1 -> val;
printf(val, '%p\n');
quitif(val rem 6 = 0);
endwhile;
[edit] PowerShell
$n = 0
do {
$n++
$n
} while ($n % 6 -ne 0)
[edit] Prolog
% initial condition
do(0):- write(0),nl,do(1).
% control condition
do(V):- 0 is mod(V,6), !, fail.
% loop
do(V) :-
write(V),nl,
Y is V + 1,
do(Y).
wloop :-
do(0).
[edit] PureBasic
x=0
Repeat
x+1
Debug x
Until x%6=0
[edit] Python
Python doesn't have a do-while loop.
val = 0
while True:
val +=1
print val
if val % 6 == 0: break
or repeat the body of the loop before a standard while.
val = 1
print val
while val % 6 != 0:
val += 1
print val
[edit] R
i <- 0
repeat
{
i <- i + 1
print(i)
if(i %% 6 == 0) break
}
[edit] Racket
Idiomatic Racket code is functional:
#lang racket
(let loop ([n 0])
(let ([n (add1 n)])
(displayln n)
(unless (zero? (modulo n 6)) (loop n))))
But an imperative version is easy to do too:
#lang racket
(define n 0)
(let loop ()
(set! n (add1 n))
(displayln n)
(unless (zero? (modulo n 6)) (loop)))
[edit] REBOL
rebol [
Title: "Loop/While"
Author: oofoe
Date: 2009-12-19
URL: http://rosettacode.org/wiki/Loop/Do_While
]
; REBOL doesn't have a specific 'do/while' construct, but 'until' can
; be used to provide the same effect.
value: 0
until [
value: value + 1
print value
0 = mod value 6
]
Output:
1 2 3 4 5 6
[edit] REXX
In the DO UNTIL construct, the expression is evaluated at the end of the DO loop,
even though it is written at the beginning.
This insures that the DO UNTIL loop will execute at least once (as coded below).
In contrast, a DO WHILE construct, the expression would be evaluated at the beginning of the DO loop, and
may cause the DO WHILE loop to not execute at all.
This necessitates the use of DO UNTIL instead of DO WHILE.
[edit] version 1
/*REXX program to demonstrate a DO UNTIL construction. */
v=0
do until v//6 == 0
v=v+1
say v
end
/*stick a fork in it, we're done.*/
output
1 2 3 4 5 6
[edit] version 2
/*REXX program to demonstrate a DO UNTIL construction. */
do v=1 until v//6==0
say v
end
/*stick a fork in it, we're done.*/
output is the same as the 1st version.
[edit] Ruby
The while statement modifier normally checks the condition before entering the loop. But if the while statement modifier is on a begin ... end statement, then it loops at least once. Same with the until statement modifier.
| while | until |
|---|---|
val = 0 |
val = 0 |
During November 2005, Yukihiro Matsumoto, the creator of Ruby, regretted this loop feature and suggested using Kernel#loop.
| break unless | break if |
|---|---|
val = 0 |
val = 0 |
All four of these examples print the numbers 1, 2, 3, 4, 5, 6.
[edit] Salmon
variable x := 0;
do
{
++x;
x!
}
while (x % 6 != 0);
[edit] SAS
/* using DO UNTIL so that the loop executes at least once */
data _null_;
n=0;
do until(mod(n,6)=0);
n=n+1;
put n;
end;
run;
[edit] Sather
class MAIN is
main is
val ::= 0;
loop
val := val + 1;
#OUT + val + "\n";
while!(val % 6 /= 0)
end;
end;
end;
[edit] Scala
var x=0
do {
println(x)
x+=1
} while(x%6!=0)
[edit] Scheme
(let loop ((i 1))
(display i)
(if (positive? (modulo i 6))
(loop (+ i 1))))
[edit] Seed7
$ include "seed7_05.s7i";
const proc: main is func
local
var integer: number is 0;
begin
repeat
incr(number);
writeln(number)
until number rem 6 = 0
end func;
[edit] Slate
[| val |
val: 0.
[val: val + 1.
print: val.
val \\ 6 ~= 0] whileTrue
] do.
[edit] Smalltalk
|val|
val := 0.
[
val := val + 1.
val displayNl.
] doWhile: [ (val rem: 6) ~= 0 ]
|val|
val := 0.
[
val := val + 1.
val displayNl.
] doUntil: [ (val rem: 6) == 0 ]
To simulate the do-while construct, we can use the whileTrue: method of a block with a void while block.
|val|
val := 0.
[
val := val + 1.
val displayNl.
(val rem: 6) ~= 0
] whileTrue: [ ]
[edit] Suneido
val = 0
do
{
Print(++val)
} while (val % 6 isnt 0)
Output:
1
2
3
4
5
6
[edit] Tcl
Tcl does not have a built-in do...while construct. This example demonstrates the ease of creating new looping contructs in plain Tcl. do procedure taken from Tcler's wiki
proc do {body keyword expression} {
if {$keyword eq "while"} {
set expression "!($expression)"
} elseif {$keyword ne "until"} {
return -code error "unknown keyword \"$keyword\": must be until or while"
}
set condition [list expr $expression]
while 1 {
uplevel 1 $body
if {[uplevel 1 $condition]} {
break
}
}
return
}
set i 0
do {puts [incr i]} while {$i % 6 != 0}
package require control
set i 0; control::do {puts [incr i]} while {$i % 6 != 0}
set i 0; control::do {puts [incr i]} until {$i % 6 == 0}
Mind you, it is also normal to write this task using a normal while as:
set i 0
while true {
puts [incr i]
if {$i % 6 == 0} break
}
[edit] TUSCRIPT
$$ MODE TUSCRIPT
var=0
LOOP
var=var+1, rest=var%6
PRINT var
IF (rest==0) EXIT
ENDLOOP
Output:
1 2 3 4 5 6
[edit] UNIX Shell
val=0
while true; do
echo $((++val))
[ $((val%6)) -eq 0 ] && break
done
val=0
while true; do
val=`expr $val + 1`
echo $val
expr $val % 6 = 0 >/dev/null && break
done
[edit] Vedit macro language
#1 = 0
do {
#1++
Num_Type(#1)
} while (#1 % 6 != 0);
[edit] Visual Basic .NET
Dim i = 0
Do
i += 1
Console.WriteLine(i)
Loop Until i Mod 6 = 0
[edit] XPL0
code CrLf=9, IntOut=11;
int V;
[V:= 0;
repeat V:= V+1;
IntOut(0, V); CrLf(0);
until rem(V/6) = 0;
]
[edit] Yorick
val = 0;
do {
val++;
write, val;
} while(val % 6 != 0);
- Programming Tasks
- Iteration
- Conditional loops
- 6502 Assembly
- ActionScript
- Ada
- Aime
- ALGOL 68
- AmigaE
- AutoHotkey
- AWK
- BASIC
- BBC BASIC
- Bc
- Befunge
- C
- C++
- C sharp
- CoffeeScript
- ColdFusion
- Common Lisp
- Clojure
- D
- Dc
- Delphi
- DWScript
- E
- Ela
- Erlang
- Factor
- Fantom
- Forth
- Fortran
- Go
- GML
- Groovy
- Haskell
- Icon
- Unicon
- J
- Java
- JavaScript
- LabVIEW
- Liberty BASIC
- Lisaac
- Lua
- Logo
- Maple
- Mathematica
- MATLAB
- Octave
- Maxima
- MAXScript
- Metafont
- МК-61/52
- Modula-2
- Modula-3
- Nemerle
- NetRexx
- OCaml
- Objeck
- Openedge/Progress
- Oz
- PARI/GP
- Pascal
- Perl
- Perl 6
- PHP
- PicoLisp
- Pike
- PL/I
- Pop11
- PowerShell
- Prolog
- PureBasic
- Python
- R
- Racket
- REBOL
- REXX
- Ruby
- Salmon
- SAS
- Sather
- Scala
- Scheme
- Seed7
- Slate
- Smalltalk
- Suneido
- Tcl
- Tcllib
- TUSCRIPT
- UNIX Shell
- Vedit macro language
- Visual Basic .NET
- XPL0
- Yorick
- GUISS/Omit