Loops/For
From Rosetta Code
You are encouraged to solve this task according to the task description, using any language you may know.
“For” loops are used to make some block of code be iterated a number of times, setting a variable or parameter to a monotonically increasing integer value for each execution of the block of code. Common extensions of this allow other counting patterns or iterating over abstract structures other than the integers.
For this task, show how two loops may be nested within each other, with the number of iterations performed by the inner for loop being controlled by the outer for loop. Specifically print out the following pattern by using one for loop nested in another:
* ** *** **** *****
[edit] ActionScript
for (var i:int = 1; i <= 5; i++) {
for (var j:int = 1; j <= i)
trace("*");
}
[edit] Ada
for I in 1..5 loop
for J in 1..I loop
Put("*");
end loop;
New_Line;
end loop;
[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
FOR i TO 5 DO
TO i DO
print("*")
OD;
print(new line)
OD
Output:
* ** *** **** *****
[edit] AmigaE
PROC main()
DEF i, j
FOR i := 1 TO 5
FOR j := 1 TO i DO WriteF('*')
WriteF('\n')
ENDFOR
ENDPROC
[edit] AppleScript
set x to returnOutput:
repeat with i from 1 to 5
repeat with j from 1 to i
set x to x & "*"
end repeat
set x to x & return
end repeat
return x
"
*
**
***
****
*****
"
[edit] AutoHotkey
Gui, Add, Edit, vOutput r5 w100 -VScroll ; Create an Edit-Control
Gui, Show ; Show the window
Loop, 5 ; loop 5 times
{
Loop, %A_Index% ; A_Index contains the Index of the current loop
{
output .= "*" ; append an "*" to the output var
GuiControl, , Output, %Output% ; update the Edit-Control with the new content
Sleep, 500 ; wait some(500ms) time, [just to show off]
}
Output .= (A_Index = 5) ? "" : "`n" ; append a new line to the output if A_Index is not "5"
}
Return ; End of auto-execution section
[edit] AWK
BEGIN {
for(i=1; i < 6; i++) {
for(j=1; j <= i; j++ ) {
printf "*"
}
}
}
[edit] BASIC
Works with: QuickBasic version 4.5
FOR i = 1 TO 5
FOR j = 1 TO i
PRINT "*";
NEXT j
NEXT i
[edit] Befunge
1>:5`#@_:>"*",v
| :-1<
^+1,+5+5<
[edit] Brainf***
>>+++++++[>++++++[>+<-]<-] place * in cell 3
+++++[>++[>>+<<-]<-]<< place \n in cell 4
+++++[ set outer loop count
[>+ increment inner counter
>[-]>[-]<<[->+>+<<]>>[-<<+>>]<< copy inner counter
>[>>.<<-]>>>.<<< print line
<<-] end loop
[edit] C
int i, j;
for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++)
putchar('*');
puts("");
}
[edit] C++
for(int i = 1; i <= 5; ++i) {
for(int j = 1; j <= i; j++)
std::cout << "*";
std::cout << std::endl;
}
[edit] C#
using System;
class Program {
static void Main(string[] args)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j <= i; j++)
{
Console.Write("*");
}
Console.WriteLine();
}
}
}
[edit] Clojure
(doseq [i (range 5), j (range (inc i)]
(print "*")
(if (= i j) (println)))
[edit] ColdFusion
Remove the leading space from the line break tag.
With tags:
<cfloop index = "i" from = "1" to = "5">
<cfloop index = "j" from = "1" to = "#i#">
*
</cfloop>
< br />
</cfloop>
With script:
<cfscript>
for( i = 1; i <= 5; i++ )
{
for( j = 1; j <= i; j++ )
{
writeOutput( "*" );
}
writeOutput( "< br />" );
}
</cfscript>
[edit] Common Lisp
(loop for i from 1 upto 5 do
(loop for j from 1 upto i do
(write-char #\*))
(write-line ""))
(dotimes (i 5)
(dotimes (j (+ i 1))
(write-char #\*))
(terpri))
(do ((i 1 (+ i 1)))
((> i 5))
(do ((j 1 (+ j 1)))
((> j i))
(write-char #\*))
(terpri))
[edit] D
for(int i = 0; i < 5; i++) {
for(int j = 0; j <= i; j++)
writef("*") ;
writefln() ;
}
Foreach Range Statement since D2.003
foreach(i ; 0..5) {
foreach(j ; 0..i+1)
writef("*") ;
writefln() ;
}
[edit] Dao
for( i = 1 : 5 ){
for( j = 1 : i ) io.write( '*' )
io.writeln()
}
[edit] DMS
number i, j
for (i = 1; i <= 5; i++)
{
for (j = 1; j <= i; j++)
{
Result( "*" )
}
Result( "\n" )
}
[edit] E
for width in 1..5 {
for _ in 1..width {
print("*")
}
println()
}
This loop is a combination of for ... in ... which iterates over something and a..b which is a range object that is iteratable. (Also, writing a..!b excludes the value b.)
[edit] FALSE
1[$6-][$[$]["*"1-]#%"
"1+]#%
[edit] Factor
5 [1,b] [ [ "*" write ] times nl ] each
[edit] Forth
: triangle ( n -- )
1+ 1 do
cr i 0 do [char] * emit loop
loop ;
5 triangle
[edit] Fortran
Works with: Fortran version 90 and later
DO i = 1, 5
DO j = 1, i
WRITE(*, "(A)", ADVANCE="NO") "*"
END DO
WRITE(*,*)
END DO
Fortran 95 (and later) has also a loop structure that can be used only when the result is independent from real order of execution of the loop.
Works with: Fortran version 95 and later
integer :: i
integer, dimension(10) :: v
forall (i=1:size(v)) v(i) = i
[edit] F#
#light
[<EntryPoint>]
let main args =
for i = 1 to 5 do
for j = 1 to i do
printf "*"
printfn ""
0
[edit] Go
for i := 1; i <= 5; i++ {
for j := 1; j <= i; j++ {
fmt.Printf("*")
}
fmt.Printf("\n")
}
[edit] HaXe
for (i in 1...6) {
for(j in 0...i) {
Lib.print('*');
}
Lib.println('');
}
[edit] Haskell
import Control.Monad
main = do
forM_ [1..5] $ \i -> do
forM_ [1..i] $ \j -> do
putChar '*'
putChar '\n'
But it's more Haskellish to do this without loops:
import Data.List (inits)
main = mapM_ putStrLn $ tail $ inits $ replicate 5 '*'
[edit] HicEst
DO i = 1, 5
DO j = 1, i
WRITE(APPend) "*"
ENDDO
WRITE() ' '
ENDDO
[edit] Icon and Unicon
[edit] Icon
procedure main()
every i := 1 to 5 do {
every 1 to i do
writes("*")
write()
}
end
[edit] Unicon
The 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:
]\ '*****'
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
for_i. 1 + i. y do.
z =. ''
for. 1 + i. i do.
z=. z,'*'
end.
z 1!:2 ] 2
end.
i.0 0
)
But you would never see J code like this.
[edit] Java
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
[edit] JavaScript
for (var i=1; i<=5; i++) {
s = "";
for (var j=0; j<i; j++)
s += '*';
print(s);
}
[edit] Lua
for i=1,5 do
for j=1,i do
io.write("*")
end
io.write("\n")
end
[edit] Lisaac
1.to 5 do { i : INTEGER;
1.to i do { dummy : INTEGER;
'*'.print;
};
'\n'.print;
};
[edit] Logo
for [i 1 5] [repeat :i [type "*] (print)]
repeat 5 [repeat repcount [type "*] (print)]
[edit] M4
define(`for',
`ifelse($#,0,``$0'',
`ifelse(eval($2<=$3),1,
`pushdef(`$1',$2)$5`'popdef(`$1')$0(`$1',eval($2+$4),$3,$4,`$5')')')')dnl
for(`x',`1',`5',`1',
`for(`y',`1',x,`1',
`*')
')
[edit] Mathematica
n=5;
For[i=1,i<=5,i++,
string="";
For[j=1,j<=i,j++,string=string<>"*"];
Print[string]
]
[edit] MATLAB
for i = (1:5)
output = [];
for j = (1:i)
output = [output '*'];
end
disp(output);
end
[edit] MAXScript
for i in 1 to 5 do
(
line = ""
for j in 1 to i do
(
line += "*"
)
format "%\n" line
)
[edit] Modula-3
MODULE Stars EXPORTS Main;
IMPORT IO;
BEGIN
FOR i := 1 TO 5 DO
FOR j := 1 TO i DO
IO.Put("*");
END;
IO.Put("\n");
END;
END Stars.
[edit] MOO
for i in [1..5]
s = "";
for j in [1..i]
s += "*";
endfor
player:tell(s);
endfor
[edit] MUMPS
[edit] Routine
FORLOOPOutput:
NEW I,J
FOR I=1:1:5 DO
.FOR J=1:1:I DO
..WRITE "*"
.WRITE !
QUIT
USER>D FORLOOP^ROSETTA * ** *** **** *****
[edit] One line
The if statement has to follow the write, or else the if statement would control the write (5 lines with one asterisk each).
FOR I=1:1:5 FOR J=1:1:I WRITE "*" IF J=I W !
[edit] NewLISP
(for (i 1 5)
(for(j 1 i)
(print "*"))
(print "\n"))
[edit] Nimrod
for i in 1..5:
for i in 1..i:
stdout.write("*")
echo("")
[edit] Objeck
bundle Default {
class For {
function : Main(args : String[]) ~ Nil {
DoFor();
}
function : native : DoFor() ~ Nil {
for (i := 0; i < 5; i += 1;) {
for (j := 0; j <= i; j += 1;) {
"*"->Print();
};
""->PrintLine();
};
}
}
}
[edit] OCaml
for i = 1 to 5 do
for j = 1 to i do
print_string "*"
done;
print_newline ()
done
[edit] Octave
for i = 0:1:4
for j = 0:1:i
printf("*");
endfor
printf("\n");
endfor
[edit] Oz
for I in 1..5 do
for _ in 1..I do
{System.printInfo "*"}
end
{System.showInfo ""}
end
Note: we don't use the inner loop variable, so we prefer not to give it a name.
[edit] Pascal
program stars(output);
var
i, j: integer;
begin
for i := 1 to 5 do
begin
for j := 1 to i do
write('*');
writeln
end
end.
[edit] Perl
for ($x = 1; $x <= 5; $x++) {
for ($y = 1; $y <= $x; $y++) {
print "*";
}
print "\n";
}
foreach (1..5) {
foreach (1..$_) {
print '*';
}
print "\n";
}
However, if we lift the constraint of two loops the code will be simpler:
print ('*' x $_ . "\n") for 1..5
[edit] Perl 6
Works with: Rakudo version #22 "Thousand Oaks"
for ^5 {
for 0..$_ {
print "*";
}
print "\n";
}
or using only one for loop:
say '*' x $_ for 1..5;
or without using any loops at all:
([\~] "*" xx 5).join("\n").say;
[edit] PHP
for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= $i; $j++) {
echo '*';
}
echo "\n";
}
or
foreach (range(1, 5) as $i) {
foreach (range(1, $i) as $j) {
echo '*';
}
echo "\n";
}
[edit] PicoLisp
(for N 5
(do N (prin "*"))
(prinl) )
[edit] Pike
int main(){
for(int i = 1; i <= 5; i++){
for(int j=1; j <= i; j++){
write("*");
}
write("\n");
}
}
[edit] PL/I
do i = 1 to 5;
put skip edit (('*' do j = 1 to i)) (a);
end;
[edit] Pop11
lvars i, j;
for i from 1 to 5 do
for j from 1 to i do
printf('*','%p');
endfor;
printf('\n')
endfor;
[edit] PowerShell
for ($i = 1; $i -le 5; $i++) {
for ($j = 1; $j -le $i; $j++) {
Write-Host -NoNewline *
}
Write-Host
}
Alternatively the same can be achieved with a slightly different way by using the range operator along with the ForEach-Object cmdlet:
1..5 | ForEach-Object {
1..$_ | ForEach-Object {
Write-Host -NoNewline *
}
Write-Host
}
while the inner loop wouldn't strictly be necessary and can be replaced with simply "*" * $_.
[edit] PureBasic
If OpenConsole()
Define i, j
For i=1 To 5
For j=1 To i
Print("*")
Next j
PrintN("")
Next i
Print(#LFCR$+"Press ENTER to quit"): Input()
CloseConsole()
EndIf
[edit] Python
import sys
for i in xrange(5):
for j in xrange(i+1):
sys.stdout.write("*")
Note that we have a constraint to use two for loops, which leads to non-idiomatic Python. If that constraint is dropped we can use the following, more idiomatic Python solution:
for i in range(1,6):
print '*' * i
[edit] R
for(i in 0:4) {
s <- ""
for(j in 0:i) {
s <- paste(s, "*", sep="")
}
print(s)
}
[edit] REBOL
; Use 'repeat' when an index required, 'loop' when repetition suffices:
repeat i 5 [
loop i [prin "*"]
print ""
]
; or a more traditional for loop:
for i 1 5 1 [
loop i [prin "*"]
print ""
]
[edit] REXX
do i = 1 to 5
s = ''
do j = 1 to i
s = s || '*'
end
say s
end
[edit] Ruby
for i in 1..5 do
for j in 1..i do
print "*"
end
puts ""
end
or
1.upto(5) do |i|
1.upto(i) do |j|
print "*"
end
puts ""
end
or
5.times do |i| # i goes from 0 to 4
(i+1).times do
print "*"
end
puts ""
end
[edit] Sather
Sather allows the definition of new iterators. Here's we define for! so that it resembles the known for in other languages, even though the upto! built-in can be used.
class MAIN is
-- from, to, step
for!(once init:INT, once to:INT, once inc:INT):INT is
i ::= init;
loop while!( i <= to );
yield i;
i := i + inc;
end;
end;
main is
i, j :INT;
loop i := for!(1, 5, 1); -- 1.upto!(5)
loop j := for!(1, i, 1); -- 1.upto!(i)
#OUT + "*";
end;
#OUT + "\n";
end;
end;
end;
[edit] Scheme
(do ((i 1 (+ i 1)))
((> i 5))
(do ((j 1 (+ j 1)))
((> j i))
(display "*"))
(newline))
[edit] Seed7
for I range 1 to 5 do
for J range 1 to I do
write("*");
end for;
writeln;
end for;
[edit] Slate
1 to: 5 do: [| :n | inform: ($* repeatedTimes: n)].
[edit] Scala
for (i <- 1 to 5) {
for (j <- 1 to i)
print("*")
println
}
[edit] Smalltalk
1 to: 5 do: [ :aNumber |
aNumber timesRepeat: [ '*' display ].
Character nl display.
]
[edit] SNOBOL4
A slightly longer, "mundane" version
ol outer = ?lt(outer,5) outer + 1 :f(end)
inner = outer; stars = ""
il stars = ?gt(inner,0) stars "*" :f(disp)
inner = inner - 1 :(il)
disp output = stars; :(ol)
end
The "real SNOBOL4" starts here:
outer b = a = ?lt(a,5) a + 1 :f(end)
inner t = t ?(b = (gt(b,0) b - 1)) "*" :s(inner)
t span("*") . terminal = :(outer)
end
one "loop" only:
a = "*****";
a a len(x = x + 1) . output :s(a)
end
... or just (courtesy of GEP2): Works with: SNOBOL4 version which defaults to anchored mode
"*****" arb $ output fail
end
[edit] Suneido
for(i = 0; i < 5; ++i)
{
str = ''
for (j = 0; j <= i; ++j)
str $= '*'
Print(str)
}
[edit] Tcl
for {set lines 1} {$lines <= 5} {incr lines} {
for {set i 1} {$i <= $lines} {incr i} {
puts -nonewline *
}
puts ""
}
Note that it would be more normal to produce this output with:
for {set i 1} {$i <= 5} {incr i} {
puts [string repeat "*" $i]
}
It bears noting that the three parts of the for loop do not have to consist of "initialize variable", "test value of variable" and "increment variable". This is a common way to think of it as it resembles the "for" loop in other languages, but many other things make sense. For example this for-loop will read a file line-by-line:
set line ""
for { set io [open test.txt r] } { ![eof $io] } { gets $io line } {
if { $line != "" } { ...do something here... }
}
(This is a somewhat awkward example; just to show what is possible)
[edit] TI-89 BASIC
Local i,j
ClrIO
For i, 1, 5
For j, 1, i
Output i*8, j*6, "*"
EndFor
EndFor
[edit] UNIX Shell
Works with: Bourne Again SHell version 3
for (( x=1; $x<=5; x=$x+1 )); do
for (( y=1; y<=$x; y=$y+1 )); do
echo -n '*'
done
echo ""
done
[edit] UnixPipes
yes \ | cat -n | (while read n ; do
[ $n -gt 5 ] && exit 0;
yes \* | head -n $n | xargs -n $n echo
done)
[edit] Vedit macro language
for (#1 = 1; #1 <= 5; #1++) {
for (#2 = 1; #2 <= #1; #2++) {
Type_Char('*')
}
Type_Newline
}
[edit] Visual Basic
'This Prints to the Debug-Window!
Dim i As Integer
Dim ii As Integer
Dim x As Integer
Dim out As String
output = ""
For i = 1 To 5
For ii = 1 To i
out = out + "*"
Next ii
Debug.Print (out)
out = ""
Next i
[edit] Visual Basic .NET
Works with: Visual Basic version 2002
For x As Integer = 0 To 4
For y As Integer = 0 To x
Console.Write("*")
Next
Console.WriteLine()
Next

