Loops/For
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:
* ** *** **** *****
ActionScript
<lang actionscript>var str:String = ""; for (var i:int = 1; i <= 5; i++) { for (var j:int = 1; j <= i; j++) str += "*"; trace(str); str = ""; }</lang>
Ada
<lang ada>for I in 1..5 loop
for J in 1..I loop Put("*"); end loop; New_Line;
end loop;</lang>
ALGOL 68
<lang algol68>FOR i TO 5 DO
TO i DO print("*") OD; print(new line)
OD</lang> Output:
* ** *** **** *****
Alore
<lang Alore>for i in 0 to 6
for j in 0 to i Write('*') end WriteLn()
end </lang>
AmigaE
<lang amigae>PROC main()
DEF i, j FOR i := 1 TO 5 FOR j := 1 TO i DO WriteF('*') WriteF('\n') ENDFOR
ENDPROC</lang>
AppleScript
<lang AppleScript>set x to return 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</lang>Output:<lang AppleScript>"
" </lang>
AutoHotkey
<lang 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</lang>
AWK
<lang awk>BEGIN {
for(i=1; i < 6; i++) { for(j=1; j <= i; j++ ) { printf "*" } print }
}</lang>
Babel
<lang babel>star_triangle: { <- { { "*" << } iter times "\n" << } -> times } main: { 10 star_triangle }
-
-
-
-
-
-
-
-
- </lang>
-
-
-
-
-
-
-
The key operator here is 'iter' which gives the current iteration of the loop body it resides in, beginning with 0 and counting up.
BASIC
<lang qbasic>for i = 1 to 5
for j = 1 to i print "*"; next j print
next i</lang>
ZX Spectrum Basic
On the ZX Spectrum, we need line numbers:
<lang basic> 10 FOR i = 1 TO 5 20 FOR j = 1 TO i 30 PRINT "*"; 40 NEXT j 50 PRINT 60 NEXT i </lang>
Batch File
<lang>@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION
for /l %%i in (1,1,5) do (
SET line= for /l %%j in (1,1,%%i) do ( SET line=!line!* ) ECHO !line!
)
ENDLOCAL</lang>
BBC BASIC
<lang>
FOR I% = 1 TO 5 FOR J% = 1 TO I% PRINT"*"; NEXT PRINT NEXT
</lang>
bc
<lang bc>for (i = 1; i <= 5; i++) { for (j = 1; j <= i; j++) "*" " " } quit</lang>
Befunge
<lang befunge>1>:5`#@_:>"*",v
| :-1< ^+1,+5+5<</lang>
Bracmat
<lang bracmat> 0:?i & whl
' ( !i+1:~>5:?i & 0:?k & whl'(!k+1:~>!i:?k&put$"*") & put$\n )
& );</lang>
Brainf***
<lang bf>>>+++++++[>++++++[>+<-]<-] place * in cell 3 +++++[>++[>>+<<-]<-]<< place \n in cell 4 +++++[ set outer loop count [>+ increment inner counter >[-]>[-]<<[->+>+<<]>>[-<<+>>]<< copy inner counter >[>>.<<-]>>>.<<< print line <<-] end inner loop ] end outer loop</lang>
Brat
<lang brat>1.to 5, { i |
1.to i, { j | print "*" } print "\n"
}</lang>
C
<lang c>int i, j; for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++) putchar('*'); puts("");
}</lang>
C++
<lang cpp>for(int i = 1; i <= 5; ++i) {
for(int j = 1; j <= i; j++) std::cout << "*"; std::cout << std::endl;
}</lang>
C#
<lang csharp>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(); } }
}</lang>
Chef
<lang chef>Asterisks Omelette.
This recipe prints a triangle of asterisks.
Ingredients. 5 eggs 1 onion 1 potato 42 ml water 10 ml olive oil 1 garlic
Method. Put eggs into the mixing bowl. Fold onion into the mixing bowl. Put eggs into the mixing bowl. Add garlic into the mixing bowl. Fold eggs into the mixing bowl. Chop onion. Put onion into the mixing bowl. Fold potato into the mixing bowl. Put olive oil into the mixing bowl. Mash potato. Put water into the mixing bowl. Mash potato until mashed. Chop onion until choped. Pour contents of the mixing bowl into the baking dish.
Serves 1.</lang>
Clojure
<lang clojure>(doseq [i (range 5), j (range (inc i))]
(print "*") (if (= i j) (println)))</lang>
ColdFusion
Remove the leading space from the line break tag.
With tags: <lang cfm><cfloop index = "i" from = "1" to = "5">
<cfloop index = "j" from = "1" to = "#i#"> * </cfloop> < br />
</cfloop></lang> With script: <lang cfm><cfscript>
for( i = 1; i <= 5; i++ ) { for( j = 1; j <= i; j++ ) { writeOutput( "*" ); } writeOutput( "< br />" ); }
</cfscript></lang>
Common Lisp
<lang lisp>(loop for i from 1 upto 5 do
(loop for j from 1 upto i do (write-char #\*)) (write-line ""))</lang>
<lang lisp>(dotimes (i 5)
(dotimes (j (+ i 1)) (write-char #\*)) (terpri))</lang>
<lang lisp>(do ((i 1 (+ i 1)))
((> i 5)) (do ((j 1 (+ j 1))) ((> j i)) (write-char #\*)) (terpri))</lang>
D
<lang d>import std.stdio: write, writeln;
void main() {
for (int i; i < 5; i++) { for (int j; j <= i; j++) write("*"); writeln(); } writeln();
foreach (i; 0 .. 5) { foreach (j; 0 .. i + 1) write("*"); writeln(); }
}</lang>
- Output:
* ** *** **** ***** * ** *** **** *****
Dao
<lang dao>for( i = 1 : 5 ){
for( j = 1 : i ) io.write( '*' ) io.writeln()
}</lang>
Dart
<lang dart>main() {
for (var i = 0; i < 5; i++) print(i);
}</lang>
dc
[...]sA defines the inner loop A and [...]sB defines the outer loop B. This program nests the entrance to loop A inside loop B.
<lang dc>[
[*]P [print asterisk]sz lj 1 + d sj [increment j, leave it on stack]sz li !<A [continue loop if i >= j]sz
]sA [
1 d sj [j = 1, leave it on stack]sz li !<A [enter loop A if i >= j]sz [
]P [print newline]sz
li 1 + d si [increment i, leave it on stack]sz 5 != i]sz
]sB 1 d si [i = 1, leave it on stack]sz 5 != i]sz</lang>
Delphi
<lang Delphi>program LoopFor;
{$APPTYPE CONSOLE}
var
i, j: Integer;
begin
for i := 1 to 5 do begin for j := 1 to i do Write('*'); Writeln; end;
end.</lang>
DWScript
<lang Delphi>var i, j : Integer;
for i := 1 to 5 do begin
for j := 1 to i do Print('*'); PrintLn();
end;</lang>
dodo0
<lang dodo0>fun for -> var, test, body, return # define a for loop using recursion (
test(var) -> continue if (continue) -> ( body(var) -> var for (var, test, body, return) ) | return(var)
) | for
fun upToFive (-> index, return) '<='(index, 5, return) | upToFive
for (1, upToFive) -> index, return (
fun countTheStars -> stars, return ( 'count'(stars) -> n '<'(n, index, return) # continue until n = index ) | countTheStars
for ("*", countTheStars) -> prefix, return 'str'(prefix, "*", return) | stars
println(stars) ->
'inc'(index, return)
) | result exit()</lang>
DMS
<lang DMS>number i, j for (i = 1; i <= 5; i++) {
for (j = 1; j <= i; j++) { Result( "*" ) } Result( "\n" )
}</lang>
E
<lang e>for width in 1..5 {
for _ in 1..width { print("*") } println()
}</lang>
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.)
Ela
<lang ela>open console
loop m n | n < m = loop' n 0 $ writen "" $ loop m (n+1)
| else = () where loop' m n | n <= m = write "*" $ loop' m (n+1) | else = ()</lang>
EGL
<lang EGL>str string; for ( i int to 5 )
str = ""; for ( j int to i ) str += "*"; end SysLib.writeStdout(str);
end</lang>
Euphoria
<lang Euphoria> for i = 1 to 5 do
for j = 1 to i do puts(1, "*") -- Same as "puts(1, {'*'})" end for puts(1, "\n") -- Same as "puts(1, {'\n'})"
end for </lang>
puts()
is a function that takes two arguments; an integer
and a sequence
. Strings are simply sequence
s; there is no string type.
The integer
specifies where to put the "string". 0 = STDIN, 1 = STDOUT, 2 = STDERR, 3+ = files that are opened with the open()
function.
puts()
prints the sequence
out, as a "string". Each element in the sequence
provided is printed out as the character with that value in the ASCII character chart.
FALSE
<lang false>1[$6-][$[$]["*"1-]#%" "1+]#%</lang>
Factor
<lang factor>5 [1,b] [ [ "*" write ] times nl ] each</lang>
Fantom
Using for loops:
<lang fantom> class ForLoops {
public static Void main () { for (Int i := 1; i <= 5; ++i) { for (Int j := 1; j <= i; ++j) { Env.cur.out.print ("*") } Env.cur.out.printLine ("") } }
} </lang>
Using range objects:
<lang fantom> class ForLoops {
public static Void main () { (1..5).each |i| { (1..i).each |j| { Env.cur.out.print ("*") } Env.cur.out.printLine ("") } }
} </lang>
Forth
<lang forth>: triangle ( n -- )
1+ 1 do cr i 0 do [char] * emit loop loop ;
5 triangle</lang> One more: <lang forth>
- limit_example
15 1 do r> r@ dup rot >r drop \ Bring limit on stack . \ And print it loop ;
\ Gforth and JSForth all work, SP-Forth brakes (different 'for' implementation?) </lang>
Fortran
<lang fortran>C WARNING: This program is not valid ANSI FORTRAN 77 code. It uses C one nonstandard character on the line labelled 5001. Many F77 C compilers should be okay with it, but it is *not* standard.
PROGRAM FORLOOP INTEGER I, J
DO 20 I = 1, 5 DO 10 J = 1, I
C Print the asterisk.
WRITE (*,5001) '*' 10 CONTINUE
C Print a newline.
WRITE (*,5000) 20 CONTINUE
STOP
5000 FORMAT (A)
C Standard FORTRAN 77 is completely incapable of completing a C WRITE statement without printing a newline. If you wanted to C write this program in valid F77, you would have to come up with C a creative way of printing varying numbers of asterisks in a C single write statement. C C The dollar sign at the end of the format is a nonstandard C character. It tells the compiler not to print a newline. If you C are actually using FORTRAN 77, you should figure out what your C particular compiler accepts. If you are actually using Fortran C 90 or later, you should replace this line with the commented C line that follows it.
5001 FORMAT (A, $)
C5001 FORMAT (A, ADVANCE='NO')
END</lang>
<lang fortran>DO i = 1, 5
DO j = 1, i WRITE(*, "(A)", ADVANCE="NO") "*" END DO WRITE(*,*)
END DO</lang>
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.
<lang fortran>integer :: i integer, dimension(10) :: v
forall (i=1:size(v)) v(i) = i</lang>
F#
<lang fsharp>#light [<EntryPoint>] let main args =
for i = 1 to 5 do for j = 1 to i do printf "*" printfn "" 0</lang>
Gambas
<lang gambas>for i = 1 to 5
for j = 1 to i print "*"; next print
next</lang>
GAP
<lang gap>for i in [1 .. 5] do
for j in [1 .. i] do Print("*"); od; Print("\n");
od;
- *
- **
- ***
- ****
- *****</lang>
GML
<lang GML>pattern = "" for(i = 1; i <= 5; i += 1)
{ for(j = 1; j <= i; j += 1) { pattern += "*" } pattern += "#" }
show_message(pattern)</lang>
Go
<lang go>package main
import "fmt"
func main() {
for i := 1; i <= 5; i++ { for j := 1; j <= i; j++ { fmt.Printf("*") } fmt.Printf("\n") }
}</lang> Output:
* ** *** **** *****
Groovy
Solution: <lang groovy>for(i in (1..6)) {
for(j in (1..i)) { print '*' } println ()
}</lang>
GW-BASIC
<lang qbasic>10 FOR I = 1 TO 5 20 FOR J = 1 TO I 30 PRINT "*"; 40 NEXT J 50 PRINT 60 NEXT I </lang>
Haxe
<lang Haxe>for (i in 1...6) { for(j in 0...i) { Sys.print('*'); } Sys.println(); }</lang>
Haskell
<lang haskell>import Control.Monad
main = do
forM_ [1..5] $ \i -> do forM_ [1..i] $ \j -> do putChar '*' putChar '\n'</lang>
But it's more Haskellish to do this without loops:
<lang haskell>import Data.List (inits)
main = mapM_ putStrLn $ tail $ inits $ replicate 5 '*'</lang>
HicEst
<lang hicest>DO i = 1, 5
DO j = 1, i WRITE(APPend) "*" ENDDO WRITE() ' '
ENDDO</lang>
Icon and Unicon
Icon
<lang Icon>procedure main() every i := 1 to 5 do {
every 1 to i do writes("*") write() }
end</lang>
Unicon
The Icon solution works in Unicon.
Inform 7
<lang inform7>repeat with length running from 1 to 5: repeat with N running from 1 to length: say "*"; say line break;</lang>
J
J is array-oriented, so there is very little need for loops. For example, except for the requirement for loops, 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). <lang j>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 )</lang>
But you would almost never see J code like this.
Java
<lang java>for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) { System.out.print("*"); } System.out.println();
}</lang>
JavaScript
<lang javascript>var i, j; for (i = 1; i <= 5; i += 1) {
s = ; for (j = 0; j < i; j += 1) s += '*'; document.write(s + '
');
}</lang>
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.
Lang5
<lang lang5>: cr "\n" . ; : dip swap '_ set execute _ ;
- nip swap drop ; : last -1 extract nip ;
- times
swap iota '_ set do dup 'execute dip _ last 0 == if break then loop drop ;
- concat "" join ;
'* 1 5 "2dup reshape concat . cr 1 +" times</lang>
Liberty BASIC
Unlike some BASICs, Liberty BASIC does not require that the counter variable be specified with 'next'. <lang lb>for i = 1 to 5
for j = 1 to i print "*"; next print
next </lang>
Lisaac
<lang Lisaac>1.to 5 do { i : INTEGER;
1.to i do { dummy : INTEGER; '*'.print; }; '\n'.print;
};</lang>
Logo
<lang logo>for [i 1 5] [repeat :i [type "*] (print)] repeat 5 [repeat repcount [type "*] (print)]</lang>
Lua
<lang lua> for i=1,5 do
for j=1,i do io.write("*") end io.write("\n")
end </lang>
M4
<lang 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', `*')
')</lang>
make
<lang make>all: line-5
ILIST != jot 5 .for I in $(ILIST)
line-$(I): asterisk-$(I)-$(I) @echo
JLIST != jot $(I) . for J in $(JLIST)
. if "$(J)" == "1" . if "$(I)" == "1" asterisk-1-1: . else IM != expr $(I) - 1 asterisk-$(I)-1: line-$(IM) . endif . else JM != expr $(J) - 1 asterisk-$(I)-$(J): asterisk-$(I)-$(JM) . endif @printf \*
. endfor .endfor</lang>
Maple
<lang Maple>> for i to 5 do to i do printf( "*" ) end; printf( "\n" ) end;
-
-
-
-
- </lang>
-
-
-
Mathematica
<lang Mathematica>n=5; For[i=1,i<=5,i++,
string=""; For[j=1,j<=i,j++,string=string<>"*"]; Print[string]
]</lang>
MATLAB / Octave
<lang MATLAB>for i = (1:5)
output = []; for j = (1:i) output = [output '*']; end disp(output);
end</lang>
Vectorized version:
<lang MATLAB>for i = (1:5)
disp(repmat('*',1,i));
end</lang>
Maxima
<lang maxima>for i thru 5 do (
s: "", thru i do s: sconcat(s, "*"), print(s)
);</lang>
MAXScript
<lang maxscript>for i in 1 to 5 do (
line = "" for j in 1 to i do ( line += "*" ) format "%\n" line
)</lang>
Mercury
<lang>:- module loops_for.
- - interface.
- - import_module io.
- - pred main(io::di, io::uo) is det.
- - implementation.
- - import_module int.
main(!IO) :-
int.fold_up(outer_loop_body, 1, 5, !IO).
- - pred outer_loop_body(int::in, io::di, io::uo) is det.
outer_loop_body(I, !IO) :-
int.fold_up(inner_loop_body, 1, I, !IO), io.nl(!IO).
- - pred inner_loop_body(int::in, io::di, io::uo) is det.
inner_loop_body(_, !IO) :-
io.write_char('*', !IO).</lang>
Modula-2
<lang modula2>MODULE For;
IMPORT InOut;
VAR i, j: INTEGER;
BEGIN
FOR i := 1 TO 5 DO FOR j := 1 TO i DO InOut.Write('*'); END; InOut.WriteLn END
END For.</lang>
Modula-3
<lang modula3>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.</lang>
MOO
<lang moo>for i in [1..5]
s = ""; for j in [1..i] s += "*"; endfor player:tell(s);
endfor</lang>
MUMPS
Routine
<lang MUMPS>FORLOOP
NEW I,J FOR I=1:1:5 DO .FOR J=1:1:I DO ..WRITE "*" .WRITE ! QUIT</lang>
Output:
USER>D FORLOOP^ROSETTA * ** *** **** *****
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). <lang MUMPS>FOR I=1:1:5 FOR J=1:1:I WRITE "*" IF J=I W !</lang>
Nemerle
<lang Nemerle>for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) { Write("*"); } WriteLine();
}</lang>
NetRexx
<lang NetRexx>/* NetRexx */ options replace format comments java crossref savelog symbols nobinary
say say 'Loops/For'
loop i_ = 1 to 5 loop for i_ say '*\-' end say end i_
</lang>
NewLISP
<lang NewLISP> (for (i 1 5)
(for(j 1 i) (print "*")) (print "\n"))
</lang>
Nimrod
<lang Python>for i in 1..5:
for i in 1..i: stdout.write("*") echo("")</lang>
Objeck
<lang 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(); }; } }
} </lang>
OCaml
<lang ocaml>for i = 1 to 5 do
for j = 1 to i do print_string "*" done; print_newline ()
done</lang>
Octave
<lang octave>for i = 0:1:4
for j = 0:1:i printf("*"); endfor printf("\n");
endfor</lang>
Order
<lang c>#include <order/interpreter.h>
ORDER_PP(
8for_each_in_range(8fn(8I, 8print( 8for_each_in_range(8fn(8J, 8print((*))), 1, 8plus(8I, 1)) 8space)), 1, 6)
)</lang> (Order cannot print newlines, so this example just uses a space.)
Oz
<lang oz>for I in 1..5 do
for _ in 1..I do {System.printInfo "*"} end {System.showInfo ""}
end</lang> Note: we don't use the inner loop variable, so we prefer not to give it a name.
PARI/GP
<lang parigp>for(a=1,5,for(b=1,a,print1("*"));print())</lang>
Pascal
<lang 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.</lang>
Perl
<lang perl>for ($x = 1; $x <= 5; $x++) {
for ($y = 1; $y <= $x; $y++) { print "*"; } print "\n";
}</lang> <lang perl>foreach (1..5) {
foreach (1..$_) { print '*'; } print "\n";
}</lang>
However, if we lift the constraint of two loops the code will be simpler:
<lang perl>print ('*' x $_ . "\n") for 1..5</lang>
Perl 6
<lang perl6>for ^5 {
for 0..$_ { print "*"; }
print "\n";
}</lang>
or using only one for loop:
<lang perl6>say '*' x $_ for 1..5;</lang>
or without using any loops at all:
<lang perl6>([\~] "*" xx 5).join("\n").say;</lang>
PHP
<lang php>for ($i = 1; $i <= 5; $i++) {
for ($j = 1; $j <= $i; $j++) { echo '*'; } echo "\n";
}</lang> or <lang php>foreach (range(1, 5) as $i) {
foreach (range(1, $i) as $j) { echo '*'; } echo "\n";
}</lang>
PicoLisp
<lang PicoLisp>(for N 5
(do N (prin "*")) (prinl) )</lang>
Pike
<lang pike>int main(){
for(int i = 1; i <= 5; i++){ for(int j=1; j <= i; j++){ write("*"); } write("\n"); }
}</lang>
PL/I
<lang PL/I> do i = 1 to 5;
put skip edit (('*' do j = 1 to i)) (a);
end; </lang>
Pop11
<lang pop11>lvars i, j; for i from 1 to 5 do
for j from 1 to i do printf('*','%p'); endfor; printf('\n')
endfor;</lang>
PowerShell
<lang powershell>for ($i = 1; $i -le 5; $i++) {
for ($j = 1; $j -le $i; $j++) { Write-Host -NoNewline * } Write-Host
}</lang>
Alternatively the same can be achieved with a slightly different way by using the range operator along with the ForEach-Object
cmdlet:
<lang powershell>1..5 | ForEach-Object {
1..$_ | ForEach-Object { Write-Host -NoNewline * } Write-Host
}</lang>
while the inner loop wouldn't strictly be necessary and can be replaced with simply "*" * $_
.
PureBasic
<lang 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</lang>
Python
<lang python>import sys for i in xrange(5):
for j in xrange(i+1): sys.stdout.write("*") print</lang>
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: <lang python>for i in range(1,6):
print '*' * i</lang>
R
<lang R>for(i in 0:4) {
s <- "" for(j in 0:i) { s <- paste(s, "*", sep="") } print(s)
}</lang>
Racket
<lang scheme>(for ([i (in-range 1 6)])
(for ([j i]) (display "*")) (newline))</lang>
REBOL
<lang 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 "" ]</lang>
REXX
version 1
<lang rexx> do i=1 to 5
s= do j=1 to i s=s || '*' end say s end</lang>
version 2
<lang rexx> do i=1 for 5
s= do i s=s'*' end say s end</lang>
Retro
<lang Retro>6 [ 0; cr [ '* emit ] times ] iter</lang>
Ruby
One can write a for loop as for i in 1..5; ...end or as for i in 1..5 do ... end or as (1..5).each do |i| ... end. All three forms call Range#each to iterate 1..5.
<lang ruby>for i in 1..5
for j in 1..i print "*" end puts
end</lang>
Ruby has other ways to code these loops; Integer#upto is most convenient.
Integer#upto | Integer#times | Kernel#loop |
---|---|---|
<lang ruby>1.upto(5) do |i| 1.upto(i) do |j| print "*" end puts end</lang> |
<lang ruby>5.times do |i| # i goes from 0 to 4 (i+1).times do print "*" end puts end</lang> |
<lang ruby>i = 1 loop do j = 1 loop do print "*" break if (j += 1) > i end puts break if (i += 1) > 5 end</lang> |
Or we can use String#* as the inner loop, and Enumerable#map as the outer loop. This shrinks the program to one line.
<lang ruby>puts (1..5).map { |i| "*" * i }</lang>
Salmon
<lang Salmon>iterate (x; [0...4])
{ iterate (y; [0...x]) print("*");; print("\n"); };</lang>
or
<lang Salmon>for (x; 0; x < 5)
{ for (y; 0; y <= x) print("*");; print("\n"); };</lang>
SAS
<lang sas>data _null_; length a $5; do n=1 to 5;
a="*"; do i=2 to n; a=trim(a) !! "*"; end; put a;
end; run;</lang>
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.
<lang sather>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; </lang>
Scheme
<lang scheme>(do ((i 1 (+ i 1)))
((> i 5)) (do ((j 1 (+ j 1))) ((> j i)) (display "*")) (newline))</lang>
Seed7
<lang seed7>for I range 1 to 5 do
for J range 1 to I do write("*"); end for; writeln;
end for;</lang>
Slate
<lang slate>1 to: 5 do: [| :n | inform: ($* repeatedTimes: n)].</lang>
Scala
<lang scala>for (i <- 1 to 5) {
for (j <- 1 to i) print("*") println
}</lang>
Smalltalk
<lang smalltalk>1 to: 5 do: [ :aNumber |
aNumber timesRepeat: [ '*' display ]. Character nl display.
]</lang> or: <lang smalltalk>1 to: 5 do: [ :row |
1 to: row do: [:col | '*' display ].
]</lang> (only for demonstration of nested for-loops; as the column is not needed, the first solution is probably clearer).
However, streams already have some builtin repetition mechanism, so a programmer might write:
<lang smalltalk>1 to: 5 do: [ :n |
Stdout next: n put: $*; cr
]</lang>
SNOBOL4
A slightly longer, "mundane" version
<lang snobol>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</lang>
The "real SNOBOL4" starts here: <lang snobol>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</lang>
one "loop" only: <lang snobol> a = "*****"; a a len(x = x + 1) . output :s(a) end</lang>
... or just (courtesy of GEP2):
<lang snobol> "*****" arb $ output fail end</lang>
Suneido
<lang Suneido>for(i = 0; i < 5; ++i)
{ str = for (j = 0; j <= i; ++j) str $= '*' Print(str) }</lang>
Tcl
<lang tcl>for {set lines 1} {$lines <= 5} {incr lines} {
for {set i 1} {$i <= $lines} {incr i} { puts -nonewline "*" } puts ""
}</lang> Note that it would be more normal to produce this output with: <lang tcl>for {set i 1} {$i <= 5} {incr i} {
puts [string repeat "*" $i]
}</lang>
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:
<lang tcl>set line "" for { set io [open test.txt r] } { ![eof $io] } { gets $io line } {
if { $line != "" } { ...do something here... }
}</lang>
(This is a somewhat awkward example; just to show what is possible)
TI-89 BASIC
<lang ti89b>Local i,j ClrIO For i, 1, 5
For j, 1, i Output i*8, j*6, "*" EndFor
EndFor</lang>
TorqueScript
<lang Torque>for(%i = 0; %i < 5; %i++) {
for(%x = %i; %x < 5; %x++) { %string = %string @ "*"; echo(%string); }
}</lang>
TUSCRIPT
<lang tuscript> $$ MODE TUSCRIPT m="" LOOP n=1,5
m=APPEND (m,"","*") PRINT m
ENDLOOP </lang> Output:
* ** *** **** *****
UNIX Shell
A conditional loop, using a while control construct, can have the same effect as a for loop. (The original Bourne Shell has no echo -n "*"
, so this uses printf "*"
.)
<lang bash>#!/bin/sh
- Using a while control construct to emulate a for loop
l="1" # Set the counters to one while [ "$l" -le 5 ] # Loop while the counter is less than five
do m="1" while [ "$m" -le "$l" ] # Loop while the counter is less than five do printf "*" m=`expr "$m" + 1` # Increment the inner counter done echo l=`expr "$l" + 1` # Increment the outer counter
done</lang>
The Bourne Shell has a for loop, but it requires a list of words to iterate. The jot(1) command from BSD can output an appropriate list of numbers.
<lang bash>for i in `jot 5`; do for j in `jot $i`; do printf \* done echo done</lang>
Bash has for loops that act like C. These loops are very good for this task.
<lang bash>for (( x=1; $x<=5; x=$x+1 )); do
for (( y=1; y<=$x; y=$y+1 )); do echo -n '*' done echo ""
done</lang>
C Shell
<lang csh>foreach i (`jot 5`) foreach j (`jot $i`) echo -n \* end echo "" end</lang>
UnixPipes
<lang bash>yes \ | cat -n | (while read n ; do
[ $n -gt 5 ] && exit 0; yes \* | head -n $n | xargs -n $n echo
done)</lang>
Vedit macro language
<lang vedit>for (#1 = 1; #1 <= 5; #1++) {
for (#2 = 1; #2 <= #1; #2++) { Type_Char('*') } Type_Newline
}</lang>
Visual Basic
<lang vb>'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</lang>
Visual Basic .NET
<lang vbnet>For x As Integer = 0 To 4
For y As Integer = 0 To x Console.Write("*") Next Console.WriteLine()
Next</lang>
XPL0
<lang XPL0>code ChOut=8, CrLf=9; int I, J; for I:= 1 to 5 do
[for J:= 1 to I do ChOut(0, ^*); CrLf(0); ]</lang>
- Programming Tasks
- Iteration
- ActionScript
- Ada
- ALGOL 68
- Alore
- AmigaE
- AppleScript
- AutoHotkey
- AWK
- Babel
- BASIC
- ZX Spectrum Basic
- Batch File
- BBC BASIC
- Bc
- Befunge
- Bracmat
- Brainf***
- Brat
- C
- C++
- C sharp
- Chef
- Clojure
- ColdFusion
- Common Lisp
- D
- Dao
- Dart
- Dc
- Delphi
- DWScript
- Dodo0
- DMS
- E
- Ela
- EGL
- Euphoria
- FALSE
- Factor
- Fantom
- Forth
- Fortran
- F Sharp
- Gambas
- GAP
- GML
- Go
- Groovy
- GW-BASIC
- Haxe
- Haskell
- HicEst
- Icon
- Unicon
- Inform 7
- J
- Java
- JavaScript
- LabVIEW
- Lang5
- Liberty BASIC
- Lisaac
- Logo
- Lua
- M4
- Make
- Jot
- Maple
- Mathematica
- MATLAB
- Octave
- Maxima
- MAXScript
- Mercury
- Modula-2
- Modula-3
- MOO
- MUMPS
- Nemerle
- NetRexx
- NewLISP
- Nimrod
- Objeck
- OCaml
- Order
- Oz
- PARI/GP
- Pascal
- Perl
- Perl 6
- PHP
- PicoLisp
- Pike
- PL/I
- Pop11
- PowerShell
- PureBasic
- Python
- R
- Racket
- REBOL
- REXX
- Retro
- Ruby
- Salmon
- SAS
- Sather
- Scheme
- Seed7
- Slate
- Scala
- Smalltalk
- SNOBOL4
- Suneido
- Tcl
- TI-89 BASIC
- TorqueScript
- TUSCRIPT
- UNIX Shell
- C Shell
- UnixPipes
- Vedit macro language
- Visual Basic
- Visual Basic .NET
- XPL0
- GUISS/Omit