Loops/Continue

From Rosetta Code

Jump to: navigation, search
Loops/Continue is a programming task. Visitors like you are encouraged to solve it according to the task description, using any language they may happen to know.
Add to BlogMarksAdd to del.icio.usAdd to diggAdd to NewsvineAdd to redditAdd to Slashdot
Show the following output using one loop.
1, 2, 3, 4, 5
6, 7, 8, 9, 10

Try to achieve the result by forcing the next iteration whitin the loop upon a specific condition, if your language allows it.

Contents

[edit] Ada

Ada has no continue reserved word, nor does it need one. The continue reserved word is only syntactic sugar for operations that can be achieved without it as in the following example.

with Ada.Text_Io; use Ada.Text_Io;
 
procedure Loop_Continue is
begin
for I in 1..10 loop
Put(Integer'Image(I));
if I mod 5 = 0 then
New_Line;
else
Put(",");
end if;
end loop;
end Loop_Continue;

[edit] ALGOL 68

ALGOL 68 has no continue reserved word, nor does it need one. The continue reserved word is only syntactic sugar for operations that can be achieved without it as in the following example:

FOR i FROM 1 TO 10 DO
print ((i,
IF i MOD 5 = 0 THEN
new line
ELSE
","
FI
))
OD

Output:

+1,         +2,         +3,         +4,         +5
+6, +7, +8, +9, +10

[edit] AutoHotkey

Loop, 10 {
Delimiter := (A_Index = 5) || (A_Index = 10) ? "`n":", "
Index .= A_Index . Delimiter
}
MsgBox %Index%

[edit] AWK

BEGIN {
for(i=1; i <= 10; i++) {
printf("%d", i)
if ( i % 5 == 0 ) {
print
continue
}
printf(", ")
}
}

[edit] C

Translation of: C++

for(int i = 1;i <= 10; i++){
printf("%d", i);
if(i % 5 == 0){
printf("\n");
continue;
}
printf(", ");
}

[edit] C++

Translation of: Java

for(int i = 1;i <= 10; i++){
cout << i;
if(i % 5 == 0){
cout << endl;
continue;
}
cout << ", ";
}

[edit] C#

Translation of: Java

using System;
 
class Program {
static void Main(string[] args) {
for (int i = 1; i <= 10; i++) {
Console.Write(i);
 
if (i % 5 == 0) {
Console.WriteLine();
continue;
}
 
Console.Write(", ");
}
}
}

[edit] Clojure

Clojure doesn't have a continue keyword. It has a recur keyword, although I prefer to work with ranges in this case.

 
(doseq
[n (range 1 11)]
(do
(print n)
(if (= (rem n 5) 0) (print "\n") (print ", "))))
 

[edit] ColdFusion

Remove the leading space from the line break tag.

<cfscript>
for( i = 1; i <= 10; i++ )
{
writeOutput( i );
if( 0 == i % 5 )
{
writeOutput( "< br />" );
continue;
}
writeOutput( "," );
}
</cfscript>

[edit] Common Lisp

Common Lisp doesn't have a continue keyword, but the do iteration construct does use an implicit tagbody, so it's easy to go to any label. Four solutions follow. The first pushes the conditional (whether to print a comma and a space or a newline) into the format string. The second uses the implicit tagbody and go. The third is a do loop with conditionals outside of the output functions.

(do ((i 1 (1+ i))) ((> i 10))
(format t "~a~:[, ~;~%~]" i (zerop (mod i 5))))
 
(do ((i 1 (1+ i))) ((> i 10))
(write i)
(when (zerop (mod i 5))
(terpri)
(go end))
(write-string ", ")
end)
 
(do ((i 1 (1+ i))) ((> i 10))
(write i)
(if (zerop (mod i 5))
(terpri)
(write-string ", ")))

These use the loop iteration form, which does not contain an implicit tagbody (though one could be explicitly included). The first uses an explicit condition to omit the rest of the loop; the second uses block/return-from to obtain the effect of skipping the rest of the code in the block which makes up the entire loop body.


(loop for i from 1 to 10
do (write i)
if (zerop (mod i 5)) do (terpri)
else do (write-string ", "))
 
(loop for i from 1 to 10 do
(block continue
(write i)
(when (zerop (mod i 5))
(terpri)
(return-from continue))
(write-string ", ")))

[edit] D

for(int i = 1;i <= 10; i++){
writef(i);
if(i % 5 == 0){
writefln();
continue;
}
writef(", ");
}

[edit] E

for i in 1..10 {
print(i)
if (i %% 5 == 0) {
println()
continue
}
print(", ")
}

[edit] Factor

There is no built-in continue in Factor.

1 10 [a,b] [ 
[ number>string write ]
[ 5 mod 0 = "\n" ", " ? write ] bi
] each

[edit] Forth

Although this code solves the task, there is no portable equivalent to "continue" for either DO-LOOPs or BEGIN loops.

: main
11 1 do
i dup 1 r.
5 mod 0= if cr else [char] , emit space then
loop ;

[edit] Fortran

Works with: Fortran version 90 and later

do i = 1, 10
write(*, '(I0)', advance='no') i
if ( mod(i, 5) == 0 ) then
write(*,*)
cycle
end if
write(*, '(A)', advance='no') ', '
end do

[edit] Haskell

As a functional language, it is not idiomatic to have true loops - recursion is used instead. Below is one of many possible implementations of the task. The below code uses a guard (| symbol) to compose functions differently for the two alternative output paths, instead of using continue like in an imperative language.

import Control.Monad (forM)
main = forM [1..10] out
where
out x | (x `mod` 5 == 0) = (putStrLn . show) x
| otherwise = (putStr . (++", ") . show) x

[edit] J

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

_2}."1'lq<, >'8!:2>:i.2 5

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 ] 10 
z=.''
for_i. 1 + i.y do.
z =. z , ": i
 
if. 0 = 5 | i do.
z 1!:2 ]2
z =. ''
continue.
end.
 
z =. z , ', '
end.
i.0 0
)

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


[edit] Java

for(int i = 1;i <= 10; i++){
System.out.print(i);
if(i % 5 == 0){
System.out.println();
continue;
}
System.out.print(", ");
}

[edit] JavaScript

Using the print() function from Rhino or SpiderMonkey.

var output = "";
for (var i = 1; i <= 10; i++) {
output += i;
if (i % 5 == 0) {
print(output);
output = "";
continue;
}
output += ", ";
}

[edit] Lisaac

1.to 10 do { i : INTEGER;
i.print;
(i % 5 = 0).if { '\n'.print; } else { ','.print; };
};

[edit] Mathematica

tmp = "";
For[i = 1, i <= 10, i++,
tmp = tmp <> ToString[i];
If[Mod[i, 5] == 0,
tmp = tmp <> "\n";
,
tmp = tmp <> ", ";
];
];
Print[tmp]

[edit] MAXScript

for i in 1 to 10 do
(
format "%" i
if mod i 5 == 0 then
(
format "\n"
continue
) continue
format ", "
)

[edit] Metafont

Metafont has no a continue (or similar) keyword. As the Ada solution, we can complete the task just with conditional.

string s; s := "";
for i = 1 step 1 until 10:
if i mod 5 = 0:
s := s & decimal i & char10;
else:
s := s & decimal i & ", "
fi; endfor
message s;
end

Since message append always a newline at the end, we need to build a string and output it at the end, instead of writing the output step by step.

Note: mod is not a built in; like TeX, "bare Metafont" is rather primitive, and normally a set of basic macros is preloaded to make it more usable; in particular mod is defined as

primarydef x mod y = (x-y*floor(x/y)) enddef;

[edit] Modula-3

Modula-3 defines the keyword RETURN as an exception, but when it is used with no arguments it works just like continue in C.

Note, however, that RETURN only works inside a procedure or a function procedure; use EXIT otherwise.

Module code and imports are omitted.

FOR i := 1 TO 10 DO
IO.PutInt(i);
IF i MOD 5 = 0 THEN
IO.Put("\n");
RETURN;
END;
IO.Put(", ");
END;

[edit] MOO

s = "";
for i in [1..10]
s += tostr(i);
if (i % 5 == 0)
player:tell(s);
s = "";
continue;
endif
s += ", ";
endfor

[edit] OCaml

There is no continue statement for for loops in OCaml, but it is possible to achieve the same effect with an exception.

# for i = 1 to 10 do
try
print_int i;
if (i mod 5) = 0 then raise Exit;
print_string ", "
with Exit ->
print_newline()
done
;;
1, 2, 3, 4, 5
6, 7, 8, 9, 10
- : unit = ()

Though even if the continue statement does not exist, it is possible to add it with camlp4.

[edit] Octave

v = "";
for i = 1:10
v = sprintf("%s%d", v, i);
if ( mod(i, 5) == 0 )
disp(v)
v = "";
continue
endif
v = sprintf("%s, ", v);
endfor

[edit] Oz

By using the "continue" feature of the for-loop, we bind C to a nullary procedure which, when invoked, immediately goes on to the next iteration of the loop.

for I in 1..10 continue:C do
{System.print I}
if I mod 5 == 0 then
{System.printInfo "\n"}
{C}
end
{System.printInfo ", "}
end

[edit] Perl

foreach (1..10) {
print $_;
if ($_ % 5 == 0) {
print "\n";
next;
}
print ', ';
}

[edit] Perl 6

Translation of: Perl

Works with: Rakudo version #21 "Seattle"

for 1 .. 10 {
.print;
unless $_ % 5 {
say '';
next;
}
print ', ';
}

[edit] PHP

for ($i = 1; $i <= 10; $i++) {
echo $i;
if ($i % 5 == 0) {
echo "\n";
continue;
}
echo ', ';
}

[edit] PicoLisp

PicoLisp doesn't have an explicit 'continue' functionality. It can always be emulated with a conditional expression.

(for (I 1 (>= 10 I) (inc I))
(print I)
(if (=0 (% I 5))
(prinl)
(prin ", ") ) )

[edit] Pike

int main(){
for(int i = 1; i <= 10; i++){
write(sprintf("%d",i));
if(i % 5 == 0){
write("\n");
continue;
}
write(", ");
}
}

[edit] PL/I

 
loop:
do i = 1 to 10;
put edit (i) (f(3));
if mod(i,5) = 0 then do; put skip; iterate loop; end;
put edit (', ') (a);
end;
 

[edit] Pop11

lvars i;
for i from 1 to 10 do
printf(i, '%p');
if i rem 5 = 0 then
printf('\n');
nextloop;
endif;
printf(', ')
endfor;

[edit] PowerShell

Translation of: C

for ($i = 1; $i -le 10; $i++) {
Write-Host -NoNewline $i
if ($i % 5 -eq 0) {
Write-Host
continue
}
Write-Host -NoNewline ", "
}

[edit] PureBasic

 
OpenConsole()
 
For i.i = 1 To 10
Print(Str(i))
If i % 5 = 0
PrintN("")
Continue
EndIf
Print(",")
Next
 
Repeat: Until Inkey() <> ""
 

[edit] Python

for i in xrange(1,11):
if i % 5 == 0:
print i
continue
print i, ",",

[edit] R

Translated from C++.

for(i in 1:10)
{
cat(i)
if(i %% 5 == 0)
{
cat("\n")
next
}
cat(", ")
}

[edit] REBOL

rebol [
Title: "Loop/Continue"
Author: oofoe
Date: 2010-01-05
URL: http://rosettacode.org/wiki/Loop/Continue
]

 
; REBOL does not provide a 'continue' word for loop constructs,
; however, you may not even miss it:
 
print "One liner (compare to ALGOL 68 solution):"
repeat i 10 [prin rejoin [i either 0 = mod i 5 [crlf][", "]]]
 
print [crlf "Port of ADA solution:"]
for i 1 10 1 [
prin i
either 0 = mod i 5 [
prin newline
][
prin ", "
]
]

Output:

One liner (compare to ALGOL 68 solution):
1, 2, 3, 4, 5
6, 7, 8, 9, 10

Port of ADA solution:
1, 2, 3, 4, 5
6, 7, 8, 9, 10

[edit] REXX

(Remember that there exists implementations of the REXX language that needs that the source begins with /*, i.e. with a comment)

do i = 1 to 10
call charout ,i", "
if i//5 = 0 then do
say
iterate
end
end

[edit] Ruby

for i in 1..10 do
print i
if i % 5 == 0 then
puts
next
end
print ', '
end

The "for" look could be written like this:

(1..10).each do |i| ...
1.upto(10) do |i| ...
10.times do |n| i=n+1; ...

Without meeting the criteria (showing loop continuation), this task could be written as:

1.upto(10) {|i| print "%d%s" % [i, i%5==0 ? "\n" : ", "]}

[edit] Suneido

ob = Object()
for (i = 1; i <= 10; ++i)
{
ob.Add(i)
if i is 5
{
Print(ob.Join(','))
ob = Object()
}
}
Print(ob.Join(','))

Output:

1,2,3,4,5
6,7,8,9,10
ok

[edit] Tcl

for {set i 1} {$i <= 10} {incr i} {
puts -nonewline $i
if {$i % 5 == 0} {
puts ""
continue
}
puts -nonewline ", "
}

[edit] UnixPipes

yes \ | cat -n | head -n 10 | xargs -n 5 echo | tr ' ' ,

[edit] Vedit macro language

for (#1 = 1; #1 <= 10; #1++) {
Num_Type(#1, LEFT+NOCR)
if (#1 % 5 == 0) {
Type_Newline
Continue
}
Message(", ")
}

[edit] Visual Basic .NET

For i = 1 To 10
Console.Write(i)
If i Mod 5 = 0 Then
Console.WriteLine()
Else
Console.Write(", ")
End If
Next
Personal tools
Google AdSense