Loops/For: Difference between revisions
(Added Algol W) |
|||
Line 58: | Line 58: | ||
***** |
***** |
||
</pre> |
</pre> |
||
=={{header|ALGOL W}}== |
|||
In Algol W, write starts a new line, writeon continues it. |
|||
<lang algolw>begin |
|||
for i := 1 until 5 do |
|||
begin |
|||
write( "*" ); |
|||
for j := 2 until i do |
|||
begin |
|||
writeon( "*" ) |
|||
end j |
|||
end i |
|||
end.</lang> |
|||
=={{header|Alore}}== |
=={{header|Alore}}== |
Revision as of 19:44, 10 May 2015
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
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:
* ** *** **** *****
8th
This illustrates two kinds of 'for' loop. The first kind is "loop", which iterates from the low to the high value, and passes the current loop index as a parameter to the inner word. The second is 'times', which takes a count and repeats the word that many times.
<lang forth> ( ( '* putc ) swap times cr ) 1 5 loop </lang>
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 60
<lang algol60>FOR i:=1 UNTIL 5 DO
FOR j:=1 UNTIL i DO OUTTEXT("*"); OUTLINE</lang>
ALGOL 68
<lang algol68>FOR i TO 5 DO
TO i DO print("*") OD; print(new line)
OD</lang>
- Output:
* ** *** **** *****
ALGOL W
In Algol W, write starts a new line, writeon continues it. <lang algolw>begin
for i := 1 until 5 do begin write( "*" ); for j := 2 until i do begin writeon( "*" ) end j end i
end.</lang>
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:
"
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>((main { 10 star_triangle ! })
(star_triangle {
dup <- { dup { "*" << } <-> iter - 1 + times "\n" << } -> times }))</lang>
- Output:
* ** *** **** ***** ****** ******* ******** ********* **********
The key operator here is 'iter' which gives the current iteration of the loop body it resides in. When used with the 'times' operator, it generates a countdown.
bash
<lang bash> for i in {1..5} do
for ((j=1; j<=i; j++)); do echo -n "*" done echo
done </lang>
BASIC
<lang qbasic>for i = 1 to 5
for j = 1 to i print "*"; next j print
next i</lang>
Applesoft BASIC
<lang ApplesoftBasic>FOR I = 1 TO 5 : FOR J = 1 TO I : PRINT "*"; : NEXT J : PRINT : NEXT</lang>
BBC BASIC
<lang>
FOR I% = 1 TO 5 FOR J% = 1 TO I% PRINT"*"; NEXT PRINT NEXT
</lang>
Creative Basic
<lang Creative Basic> OPENCONSOLE
FOR X=1 TO 5
FOR Y=1 TO X
PRINT"*",:'No line feed or carriage return after printing.
NEXT Y
NEXT X
PRINT:PRINT"Press any key to end."
DO:UNTIL INKEY$<>""
CLOSECONSOLE
END </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>
FBSL
<lang qbasic>
- APPTYPE CONSOLE
FOR dim i = 1 TO 5
FOR dim j = 1 TO i PRINT "*"; NEXT j PRINT
NEXT i Pause</lang>
- Output:
* ** *** **** ***** Press any key to continue...
IWBASIC
<lang IWBASIC> OPENCONSOLE
FOR X=1 TO 5
FOR Y=1 TO X
LOCATE X,Y:PRINT"*"
NEXT Y
NEXT X
CLOSECONSOLE
END
'Could also have been written the same way as the Creative Basic example, with no LOCATE command. </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>
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>
Run BASIC
<lang runbasic> FOR i = 1 TO 5
FOR j = 1 TO i PRINT "*"; NEXT j PRINT
NEXT i </lang>
Visual Basic
Works with: VB6 <lang vb>Public OutConsole As Scripting.TextStream For i = 0 To 4
For j = 0 To i OutConsole.Write "*" Next j OutConsole.WriteLine
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>
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>
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>
Chapel
<lang chapel>for i in 1..5 {
for 1..i do write('*'); writeln();
}</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>
COBOL
<lang cobol> IDENTIFICATION DIVISION.
PROGRAM-ID. Display-Triangle.
DATA DIVISION. WORKING-STORAGE SECTION. 01 Outer-Counter PIC 9. 01 Inner-Counter PIC 9.
PROCEDURE DIVISION. PERFORM VARYING Outer-Counter FROM 1 BY 1 UNTIL 5 < Outer-Counter
PERFORM VARYING Inner-Counter FROM 1 BY 1 UNTIL Outer-Counter < Inner-Counter DISPLAY "*" NO ADVANCING END-PERFORM
DISPLAY "" *> Output a newline END-PERFORM
GOBACK .
</lang>
Coq
<lang coq>Section FOR.
Variable T : Type. Variable body : nat -> T -> T. Variable start : nat.
Fixpoint for_loop n : T -> T := match n with | O => fun s => s | S n' => fun s => for_loop n' (body (start + n') s) end.
End FOR.
Eval vm_compute in
for_loop _ (fun i => cons (for_loop _ (fun j => cons tt) 0 (S i) nil ) ) 0 5 nil.
</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++) for (var j = 0; j < i + 1; j++) print("*"); print("\n");
}</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>
Erlang
<lang erlang>%% Implemented by Arjun Sunel -module(nested_loops). -export([main/0, inner_loop/0]).
main() -> outer_loop(1).
inner_loop()-> inner_loop(1).
inner_loop(N) when N rem 5 =:= 0 -> io:format("* ");
inner_loop(N) -> io:fwrite("* "), inner_loop(N+1).
outer_loop(N) when N rem 5 =:= 0 -> io:format("*");
outer_loop(N) -> outer_loop(N+1), io:format("~n"), inner_loop(N). </lang>
ERRE
<lang ERRE> FOR I=1 TO 5 DO
FOR J=1 TO I DO PRINT("*";) END FOR PRINT
END FOR </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>
But if one accepts that a do-loop can be expressed without the actual word "do" (or "for"), then <lang Fortran>
DO 1 I = 1,5 1 WRITE (6,*) ("*", J = 1,I) END
</lang> That is a complete programme, though a more polite source file would have INTEGER I,J. It uses the old-style DO label etc. style of DO-loop to save on having to specify an END DO. The WRITE statement's output list is generated by an "implied" DO-loop having much of the form of DO J = 1,I and is indeed a proper loop. The output item is a text literal, which in earlier Fortran was unknown, however the result can still be achieved: <lang Fortran>
DO 1 I = 1,5 1 WRITE (6,2) (666, J = 1,I) 2 FORMAT(5I1) END
</lang> This works because if a value cannot be fitted into its output field, the field is filled with asterisks. Which, is what is wanted! Just allow one digit for output (I1), and present a large integer.
Frink
<lang frink> for n = 1 to 5 {
for a = 1 to n print["*"]
println[]
} </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>
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>
jq
<lang jq># Single-string version using explicit nested loops: def demo(m):
reduce range(0;m) as $i (""; reduce range(0;$i) as $j (.; . + "*" ) + "\n" ) ;
- Stream of strings:
def demo2(m):
range(1;m) | reduce range(0;.) as $j (""; . + "*");
- Variation of demo2 using an implicit inner loop:
def demo3(m): range(1;m) | "*" * . ;</lang> Example using demo(6)
- Output:
$ jq -r -n -f loops_for.jq * ** *** **** *****
Julia
<lang Julia> for i in 1:5
for j in 1:i print("*") end println()
end </lang>
- Output:
* ** *** **** *****
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>
Lasso
<lang Lasso>loop(5) => {^
loop(loop_count) => {^ '*' ^} '\r'
^}</lang>
Lisaac
<lang Lisaac>1.to 5 do { i : INTEGER;
1.to i do { dummy : INTEGER; '*'.print; }; '\n'.print;
};</lang>
LiveCode
<lang LiveCode>put 0 into n repeat for 5 times
add 1 to n repeat for n times put "*" end repeat put return
end repeat</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>
Nim
<lang Python>for i in 1..5:
for i in 1..i: stdout.write("*") echo("")</lang>
Oberon-2
Works with oo2c Version 2 <lang oberon2> MODULE LoopFor; IMPORT
Out;
VAR
i, j: INTEGER;
BEGIN
FOR i := 1 TO 5 DO FOR j := 1 TO i DO Out.Char('*'); END; Out.Ln END
END LoopFor. </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>
Oforth
<lang Oforth>func: loopFor(n) { | i j |
n loop: i [ i loop: j [ "*" print ] printcr ]
}</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.
Panoramic
<lang Panoramic> dim x,y
for x=1 to 5
for y=1 to x print "*"; next y
next x </lang>
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
Basic version: <lang PL/I>do i = 1 to 5;
do j = 1 to i; put edit ('*') (a); end; put skip;
end;</lang> Advanced version: <lang PL/I>do i = 1 to 5;
put skip edit (('*' do j = 1 to i)) (a);
end;</lang> Due to the new line requirement a mono line version is not possible <lang PL/I>put edit ((('*' do j = 1 to i)do i=1 to 5))(a); /* no new line */</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 "*" * $_
.
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 racket>(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.
for | Range#each |
---|---|
<lang ruby>for i in 1..5 for j in 1..i print "*" end puts end</lang> |
<lang ruby>(1..5).each do |i| (1..i).each do |j| 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>
Sidef
for(;;) loop: <lang ruby>for (var i = 1; i <= 5; i++) {
for (var j = 1; j <= i; j++) { print '*'; }; print "\n";
}</lang>
for([]) loop: <lang ruby>for (1..5) { |i|
for (1..i) { print '*' }; print "\n";
}</lang>
Alternatively: <lang ruby>for (1..5) { |i|
for (i..5) { |j| say '*'*j; break; }
}</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>
Simula
<lang simula>FOR I:=1 UNTIL 5 DO
FOR J:=1 UNTIL I DO OUTTEXT("*"); OUTLINE</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>
Sparkling
<lang sparkling>for (var row = 1; row <= 5; row++) {
for (var col = 1; col <= row; col++) { printf("*"); }
print();
}</lang>
Suneido
<lang Suneido>for(i = 0; i < 5; ++i)
{ str = for (j = 0; j <= i; ++j) str $= '*' Print(str) }</lang>
Swift
<lang swift>for i in 1...5 {
for j in 1...i { print("*") } println()
}</lang>
- Output:
* ** *** **** *****
Alternately: <lang swift>for i in 1..<6 {
for j in 1..<i+1 { print("*") } println()
}</lang>
- Output:
* ** *** **** *****
Alternately: <lang swift>for var i = 1; i <= 5; i++ {
for var j = 1; j <= i; j++ { print("*") } println()
}</lang>
- Output:
* ** *** **** *****
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-83 BASIC
For loops in TI-83 BASIC are notated with 3 or 4 parameters: For(A,B,C,D).
A is a the variable name to iterate
B is the number at which A starts
C is the number at which A stops (the for loop passes through once when A=B
D is optional, it is the increment value of A.
<lang ti83b>ClrHome
For(I,1,5)
For(J,1,I)
Output(I,J,"*")
End
End</lang>
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>
Wart
<lang wart>for i 1 (i <= 5) ++i
for j 0 (j < i) ++j pr "*" (prn)</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>
zkl
<lang zkl>foreach i in ([1..5]){
foreach j in (i){print("*")} println();
}</lang>
- Output:
* ** *** **** *****
- Programming Tasks
- Iteration
- Simple
- GUISS/Omit
- 8th
- ActionScript
- Ada
- ALGOL 60
- ALGOL 68
- ALGOL W
- Alore
- AmigaE
- AppleScript
- AutoHotkey
- AWK
- Babel
- Bash
- BASIC
- Applesoft BASIC
- BBC BASIC
- Creative Basic
- GW-BASIC
- FBSL
- IWBASIC
- Liberty BASIC
- PureBasic
- Run BASIC
- Visual Basic
- Visual Basic .NET
- ZX Spectrum Basic
- Batch File
- Bc
- Befunge
- Bracmat
- Brainf***
- Brat
- C
- C++
- C sharp
- Chapel
- Chef
- COBOL
- Coq
- Clojure
- ColdFusion
- Common Lisp
- D
- Dao
- Dart
- Dc
- Delphi
- DWScript
- Dodo0
- DMS
- E
- Ela
- EGL
- Erlang
- ERRE
- Euphoria
- FALSE
- Factor
- Fantom
- Forth
- Fortran
- Frink
- F Sharp
- Gambas
- GAP
- GML
- Go
- Groovy
- Haxe
- Haskell
- HicEst
- Icon
- Unicon
- Inform 7
- J
- Java
- JavaScript
- Jq
- Julia
- LabVIEW
- Lang5
- Lasso
- Lisaac
- LiveCode
- Logo
- Lua
- M4
- Make
- Jot
- Maple
- Mathematica
- MATLAB
- Octave
- Maxima
- MAXScript
- Mercury
- Modula-2
- Modula-3
- MOO
- MUMPS
- Nemerle
- NetRexx
- NewLISP
- Nim
- Oberon-2
- Objeck
- OCaml
- Oforth
- Order
- Oz
- Panoramic
- PARI/GP
- Pascal
- Perl
- Perl 6
- PHP
- PicoLisp
- Pike
- PL/I
- Pop11
- PowerShell
- Python
- R
- Racket
- REBOL
- REXX
- Retro
- Ruby
- Salmon
- SAS
- Sather
- Scheme
- Seed7
- Sidef
- Slate
- Scala
- Simula
- Smalltalk
- SNOBOL4
- Sparkling
- Suneido
- Swift
- Tcl
- TI-83 BASIC
- TI-89 BASIC
- TorqueScript
- TUSCRIPT
- UNIX Shell
- C Shell
- UnixPipes
- Vedit macro language
- Wart
- XPL0
- Zkl