Loops/For: Difference between revisions

From Rosetta Code
Content added Content deleted
(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
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:

*
**
***
****
*****

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

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

<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

Works with: QuickBasic version 4.5

<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

PRINT

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>

  1. 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

PRINT

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.

Translation of: bc

<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 sequences; 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

Works with: Fortran version 77 and later

<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>
Works with: Fortran version 90 and later

<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.

Works with: Fortran version 95 and later

<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;

  1. *
  2. **
  3. ***
  4. ****
  5. *****</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" ) ;
  1. Stream of strings:

def demo2(m):

 range(1;m)
 | reduce range(0;.) as $j (""; . + "*");
  1. 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>

<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

Works with: BSD make
Library: jot

<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
   

print

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

Works with: Rakudo version #22 "Thousand Oaks"

<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

Works with: SIMULA-67

<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:

Works with: Smalltalk/X

<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):

Works with: SNOBOL4 version which defaults to anchored mode

<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 "*".)

Works with: Bourne Shell

<lang bash>#!/bin/sh

  1. 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.

Works with: Bourne Shell
Library: jot

<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.

Works with: Bourne Again SHell version 3

<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

Library: jot

<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:
*
**
***
****
*****