59
\$\begingroup\$

Inspired by a task for programming 101 here's a task that hopefully isn't too easy or is a duplicate (kinda hard to search for things like this).

Input:

  • A positive integer n >= 1.

Output:

  • n lines of asterisks, where every new line has one asterisk more than the line before, and starting with one asterisk in the first line.

General rules:

  • This is code-golf, so shortest answer in bytes wins.
  • Since the course is taught in C++, I'm eager to see solutions in C++.

Test case (n=5):

*
**
***
****
*****
\$\endgroup\$
  • 6
    \$\begingroup\$ Not duplicate, just subset of Generate a right triangle. \$\endgroup\$ – manatwork Oct 10 '16 at 12:20
  • 2
    \$\begingroup\$ Training spaces allowed on each line? \$\endgroup\$ – Luis Mendo Oct 10 '16 at 12:33
  • 2
    \$\begingroup\$ Is a trailing new line acceptable? \$\endgroup\$ – Fatalize Oct 10 '16 at 12:34
  • 1
    \$\begingroup\$ Is a leading newline allowed? \$\endgroup\$ – Riley Oct 10 '16 at 14:38
  • \$\begingroup\$ I don't see a reason why not. \$\endgroup\$ – Sickboy Oct 11 '16 at 11:35

138 Answers 138

1
\$\begingroup\$

Gema, 36 characters

*=@repeat{*;@append{s;\*}@out{$s\n}}

Sample run:

bash-4.3$ gema '*=@repeat{*;@append{s;\*}@out{$s\n}}' <<< 5
*
**
***
****
*****
\$\endgroup\$
1
\$\begingroup\$

Forth, 39 bytes

Quite simple, with a couple of nested loops. ASCII 42 is an asterisk.

: f 0 do I -1 do 42 emit loop CR loop ;

Try it online

Prints a trailing newline.

\$\endgroup\$
1
\$\begingroup\$

Bash, 35 characters

for((;i++<$1;));{ s+=\*;echo "$s";}

Sample run:

bash-4.3$ bash draw-an-asterisk-triangle.sh 5
*
**
***
****
*****
\$\endgroup\$
1
\$\begingroup\$

C++, 108 chars

#import<iostream>
main(){int n;std::cin>>n;for(int i=1;i<=n;++i){for(int j=i;j--;)std::cout<<"*";puts("");}}

Straightforward.

Try it online

\$\endgroup\$
  • \$\begingroup\$ Can the < be moved directly next to the #include? (I don't do C++, just a wild guess based on Java knowledge) \$\endgroup\$ – Addison Crump Oct 10 '16 at 14:30
  • \$\begingroup\$ You're right.__ \$\endgroup\$ – John Doe Oct 10 '16 at 14:31
  • 1
    \$\begingroup\$ The #include does need to be included in the byte count. \$\endgroup\$ – mbomb007 Oct 10 '16 at 14:39
  • \$\begingroup\$ Thanks for the C++ solution, but there's a shorter one ;-) \$\endgroup\$ – Sickboy Oct 11 '16 at 11:33
1
\$\begingroup\$

Vitsy, 19 16 bytes

Yeah this needs some reducing. I'm out of practice!

D1H}\[\['*'O]aO]

(implicit input)
D                 Peek n, push n.
 1                Push 1.
  H               Pop x, pop y, push range(x, y)
   }              Reverse, pop n, reverse, push n.
    \[         ]  Pop n, do bracketed items n times.
      \[    ]     Pop n, do bracketed items n times.
        '*'O      Output the character *.
             aO   Output a newline.

Think of it as though I'm iterating through a list (1 through n) and popping out the number of *s according to the currently selected list item.

Explanation soon.

\$\endgroup\$
  • \$\begingroup\$ Is implicit input new for vitsy? \$\endgroup\$ – Conor O'Brien Oct 11 '16 at 0:30
  • \$\begingroup\$ @ConorO'Brien Nope, that's been around since the beginning for numerical inputs through the command line. \$\endgroup\$ – Addison Crump Oct 11 '16 at 0:31
  • \$\begingroup\$ Huh. My memory fails me, then. \$\endgroup\$ – Conor O'Brien Oct 11 '16 at 0:32
1
\$\begingroup\$

Clojure, 59 bytes

#(doseq[m(range 1(inc %))](println(apply str(repeat m\*))))

Basically, just uses doseq to loop over the range, printing the corresponding number of stars.

It's really unfortunate that the shortest way I've been able to repeat a character in Clojure is (apply str (repeat m \*)). That's hardly competitive here. Some good ol' python string multiplication would have been awesome.

Ungolfed:

(defn tri [n]
  (doseq [m (range 1 (inc n))]
    (println (apply str (repeat m \*)))))

Should be fairly self-explanatory.

\$\endgroup\$
1
\$\begingroup\$

Jolf, 7 bytes

This time, the builtin didn't let me win. Oh well.

―t0jj'*

Try it here!

Explanation

―t0jj'*
―t0     pattern: left-corner-base triangle
   j     with <input> height
    j    and <input> width.
     '*  comprised of asterisks
\$\endgroup\$
1
\$\begingroup\$

Befunge93, 31 chars (3 spaces, 8 pure directionals)

&>:#v_@
-^  : >$55+,1
,"*"<_^#:-1

Befunge98, 28 chars

&>:#v_@
-^  : >$a,1
1,*'<_^#:-
\$\endgroup\$
  • \$\begingroup\$ This prints the triangle upside down \$\endgroup\$ – Jo King Dec 29 '17 at 13:45
  • \$\begingroup\$ The enemy's gate is down \$\endgroup\$ – Demur Rumed Jan 14 '18 at 15:45
1
\$\begingroup\$

Java 7,72 70 bytes

Thanks to @kevin for shave it off by 2 bytes.

String f(int n,String s,String c){return n<1?c:f(--n,s+"*",c+s+"\n");}

Output

*
**
***
****
*****
******
\$\endgroup\$
  • \$\begingroup\$ Nice approach, +1! Btw, you can golf it by 1 more byte by changing c+= to c+. \$\endgroup\$ – Kevin Cruijssen Oct 11 '16 at 8:41
  • \$\begingroup\$ I see you've removed both s+= and c+=. I tried the same thing, but now your output is incorrect and contains a leading new line. The s+= should remain and c+= can be c+ for the same output without leading empty line. If OP allows leading newlines then it's of course fine like this. \$\endgroup\$ – Kevin Cruijssen Oct 11 '16 at 9:22
1
\$\begingroup\$

Ruby, 32 bytes

1.upto($*[0].to_i){|i|puts"*"*i}

The $* is an array of arguments.

foo.rb 5 will print the following:

*
**
***
****
*****
\$\endgroup\$
  • \$\begingroup\$ Unless stated otherwise in the question, the answers should be full programs or functions. In both cases input and output should be handled properly either explicitly by the code itself, or implicitly by the interpreter, if it has such feature. You can not assume your code will find input data in some variable nor to just leave the result in a variable. As it is now, your code is considered a snippet, which is not a valid answer. \$\endgroup\$ – manatwork Oct 11 '16 at 9:42
  • \$\begingroup\$ ARGV[0]? Sure? Ruby 2.3.1 I use receives command line arguments as String, not Fixnum. \$\endgroup\$ – manatwork Oct 11 '16 at 9:51
  • \$\begingroup\$ is the output of that okay? It's kinda implicit, but it is returned. \$\endgroup\$ – IMP1 Oct 11 '16 at 10:04
  • 1
    \$\begingroup\$ If you ask me, is not valid. Katenkyo suggested in meta to allow such things as he claims Lua programs are able to return string. His suggestion received only 1 upvote and 1 downvote, so there is no consensus on that. In meantime I consider “Programs may output using their exit code... ... if and only if the challenge requires an integer as output, obviously.” relevant with 40 upvotes and 5 downvotes. \$\endgroup\$ – manatwork Oct 11 '16 at 10:19
  • 1
    \$\begingroup\$ "Returning a string from a program" doesn't seem well-defined since it's in no way observable. You can fix your program at the cost of a single byte by using $><<"*"*i instead of "*"*i+$/ though. \$\endgroup\$ – Martin Ender Oct 11 '16 at 10:23
1
\$\begingroup\$

Excel VBA, 109 bytes

This function returns to cell, requires text wrapping be turned on.

Function a(b)
For i = 1 To b
For c = 1 To i
d = "*" & d
Next c
a = a & d & Chr(10)
d = ""
Next i
End Function

99 Bytes - Alternative that runs as a function but prints to immediate.

Function f(b)
For i = 1 To b
For c = 1 To i
Debug.Print "*";
Next c
Debug.Print
Next i
End Function

94 Bytes - One more that is just a sub with hard coded value, prints to immediate.

Sub k()
r = 5
For i = 1 To r
For c = 1 To i
Debug.Print "*";
Next c
Debug.Print
Next i
End Sub
\$\endgroup\$
1
\$\begingroup\$

PHP, 66 58 bytes

Just a simple loop, really.

I'm new to golfing, so might not be the shortest way.

for($i=fgets(STDIN);$x++<$i;)echo str_repeat("*",$x)."\n";

https://eval.in/658719

Thanks to manatwork for byte-saving.

\$\endgroup\$
  • 1
    \$\begingroup\$ No need to explicitly initialize $x, so you can leave that out and move the initialization of $i in its place to spare 1 ; separator. And you can combine the loop's test with the loops stepping: for($i=fgets(STDIN);$x++<$i;)echo str_repeat("*",$x)."␤"; \$\endgroup\$ – manatwork Oct 11 '16 at 15:24
1
\$\begingroup\$

Javascript, 71 bytes 48 Bytes, thanks ETHproductions!

(n,c)=>{while(c<=n)console.log("*".repeat(c++))}
\$\endgroup\$
  • \$\begingroup\$ Welcome to PPCG! You don't need to call the function, just define it: (n,c)=>{while(c<=n){console.log("*".repeat(c++));}} is a valid entry. Also, you don't need the braces in the while loop, nor the semicolon at the end: (n,c)=>{while(c<=n)console.log("*".repeat(c++))} \$\endgroup\$ – ETHproductions Oct 11 '16 at 15:21
1
\$\begingroup\$

Ruby, 29 bytes

->n{n.times{|i|puts'*'*i+?*}}

Call with ->n{n.times{|i|puts'*'*i+?*}}[number].

\$\endgroup\$
  • \$\begingroup\$ No need for parenthesis around the proc parameter and is shorter to add a literal character than to add 1 to the multiplier ('*'*(i+1)'*'*i+?*). (BTW, you can call anonymous proc without assigning it to a variable: ->n{n.times{|i|puts'*'*i+?*}}[5].) \$\endgroup\$ – manatwork Oct 11 '16 at 9:49
1
\$\begingroup\$

VBA, 84 bytes

taking advantage of recursive coding. it generates x times * as the line/round

Function f(x)
If x<=1 Then f="*" Else f=f(x-1) & vbCrLf & String(x,"*")
End Function

results:

?f(10)
*
**
***
****
*****
******
*******
********
*********
**********
?f(2)
*
**

?f(5)
*
**
***
****
*****
\$\endgroup\$
1
\$\begingroup\$

C++, 78 bytes

I don't know how there are 2 C++ answers that don't just do it with for loops. Very short and sweet this way:

void T(int n){for(int i=1;i<=n;i++){for(int j=0;j<i;j++)cout<<'*';cout<<'\n';}}

Full program

#include <iostream>

using namespace std;

void T(int n)
{
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j < i; j++)
            cout << '*';
        cout << '\n';
    }
}

int main()
{
  T(5);
}

Edit: it is unclear to me whether to count the #include<iostream>, using namespace std, and/or std::whatever in calls. C/C++ answers all over this site seem to use both, and for the most part no one seems to care except for the occasional comment. If I need the std::, then +10. If I need the #include<iostream>, +18 (although GCC allows me to do without the basic includes, so maybe not that one)

\$\endgroup\$
1
\$\begingroup\$

Common Lisp (Lispworks), 71 bytes

(defun f(n)(dotimes(i n)(dotimes(j(1+ i))(format t"*"))(format t"~%")))

Usage:

CL-USER 170 > (f 5)
*
**
***
****
*****
NIL

Ungolfed:

(defun f (n)
  (dotimes (i n)
    (dotimes (j (1+ i))
      (format t "*"))
    (format t "~%")))
\$\endgroup\$
1
\$\begingroup\$

MoonScript, 31 bytes

(n)->for i=1,n
 print "*"\rep i

Sample call:

_ 5
\$\endgroup\$
1
\$\begingroup\$

F#, 114 chars

[<EntryPoint>]
let main a =
 for i = 1 to System.Int32.Parse(a.[0]) do
  printfn "%s" <| String.replicate i "*"
 0
\$\endgroup\$
  • \$\begingroup\$ Welcome to the site! I don't know anything about F#, but it looks like you might be able to take away some of the whitespace? \$\endgroup\$ – DJMcMayhem Oct 13 '16 at 16:18
  • \$\begingroup\$ Thanks! My first golf, both in my company and on the site. I did try and so far it looks like the other "type" of F# syntax is "verbose", which just gets longer. The indentation is the "light" syntax, which at minimum is a new line char and a space to indent. We do these in our slack channel but i didn't see any F# answers here, so i figured I would post! I can update with test cases but anyone can copy into a new F# console app and run pretty easily with VS 2015 Community and the F# tools, all of which are free. \$\endgroup\$ – magumbasauce Oct 13 '16 at 23:49
1
\$\begingroup\$

Braingasm, 27 bytes

Braingasm is a brainfuck variant with just a few more instructions and options. And this task would've been so much easier if I had bothered implementing that as many times as the value in the current cell thing yet..

;[->+[->+42.<]10.>[-<+>]<<]

Here's how it works:

;                           Read an integer from stdin and write it to cell#1
 [                        ] While the value of cell#1 is not zero,
  ->+                    <    substract one from cell#1 and add one to cell#2.
     [->+   <]                Each time, do the same between cell#2 and cell#3,
         42.                    but also print an asterix on the way.
              10.             Then print a newline.
                 >[-<+>]<     Move the value from cell#3 back to cell#2
\$\endgroup\$
1
\$\begingroup\$

Python 3, 196 Bytes

import contextlib as b,io;q=io.StringIO()
with b.redirect_stdout(q):import this
n=int(input());c=q.getvalue()[655];print(''.join([''.join([c for z in range(n)][:i+1])+'\n' for i in range(n)]))

This is probably counted as a cheat, but it uses the asterisk character in the import this string rather than explicitly writing an asterisk in the program code. It also doesn't use any asterisk multiplication operators. It temporarily rerouts stdout so as not to print the Zen of Python when run.

\$\endgroup\$
1
\$\begingroup\$

05AB1E, 8 bytes

TžQè×.p»

Explanation coming soon

\$\endgroup\$
1
\$\begingroup\$

Scala, 44 30 bytes (51 45 without asterisk, 41 for hourglass)

With asterisk in code (30 bytes):

(i:Int)=>(i to(1,-1))map("*"*) //create a range from i to 1 and map each number to that number of asterisks

Without asterisk (45 bytes):

(i:Int)=>(i to(1,-1))map(((41+1).toChar+"")*) //same as above, but without a literal asterisk

Without asterisk and easy ways of calculating 42 (57 bytes):

(i:Int)=>(i to(1,-1))map(((math sqrt("7G"##)).toChar+"")*)

## is the hashcode method, which returns 1764 for the string "7G", the square root of 1764 is 42, the ascii code for *

Hourglass:

(& :Int)=>((&to(1,-1))++(2 to&))map("*"*)

(& :Int)=>        //define an anonymus function with an int parameter called &
  (              
    (& to (1,-1))   //a range from & to 1, counting by -1, aka downwards
    ++              //concat
    (2 to&)         //a range from 2 to &
  )
  map(              //map each number to
    "*" *             //the string "*" repeated x times
  )
\$\endgroup\$
  • 1
    \$\begingroup\$ @TheBitByte You're right, I didn't notice that I've used asterisks for multiplication / string repitition. I just thought that I could replace '*' with (7*6).toChar and that's it. \$\endgroup\$ – corvus_192 Oct 14 '16 at 14:50
  • 1
    \$\begingroup\$ The bounty spec is not really precise, it just states "other cheating methods". I have no idea what you consider cheating. \$\endgroup\$ – corvus_192 Oct 16 '16 at 18:15
  • 1
    \$\begingroup\$ @TheBitByte What do you consider acceptable then? sqrt(1764)? Building a sequence of 42 ones and summing them? Using a string used somewhere in the standard library and extract an asterisk from it? \$\endgroup\$ – corvus_192 Oct 16 '16 at 18:39
  • 1
    \$\begingroup\$ @TheBitByte It's your bounty, you can make the rules but you should precisely state what you allow and what you consider cheating. \$\endgroup\$ – corvus_192 Oct 16 '16 at 19:02
  • 1
    \$\begingroup\$ @TheBitByte I know that scala can't win against all those golfing languages \$\endgroup\$ – corvus_192 Oct 16 '16 at 19:14
1
\$\begingroup\$

Element, 16 bytes

_'[1+'[\*`]\
`"]

Try it online!

Explanation:

This is a pretty simple nested-loop approach. Let N represent the newline in the source code.

_'[1+'[\*`]\N`"]
_'                take input and move it to the control stack
  [            ]  a FOR loop, each iteration = 1 line of output
  [1+          ]  increment the top of the stack, as a counter
  [  '         ]  move that value to the control stack
  [   [   ]    ]  another FOR loop, for the current line
  [   [\*`]    ]  output a literal asterisk
  [        \N` ]  output a literal newline
  [           "]  move the counter from control to main stack
\$\endgroup\$
1
\$\begingroup\$

C++, 63 bytes

void s(int n){if(n)s(n-1),cout<<setfill('*')<<setw(n+1)<<"\n";}

Usage:

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    s(5);
}

Overrides the filling character (which is usually a space), and outputs an empty string (or actually a newline).

One weird thing about this code is the usage of if (...) - I cannot find a way to replace it by a conditional operator ... ? ... : ....

\$\endgroup\$
1
\$\begingroup\$

Swift 3, 86 bytes

for i in 1...Int(CommandLine.arguments[1])!{print(String(repeatElement("*",count:i)))}

Yuck. If I can drop the Int and String initializers I might be able to get this shorter than Java. Open to any optimizations.

Ungolfed:

import Foundation

guard CommandLine.argc > 1, let a = Int(CommandLine.arguments[1]) else {
    fatalError("Invalid or nonexistent argument")
}

for i in 1...a {
    print(String(repeatElement("*", count: i)))
}

Usage:

➜ ~ swift asterisk.swift 5
*
**
***
****
*****
\$\endgroup\$
1
\$\begingroup\$

><>, 47 bytes

<v[1:$-1;!?:$+10
0\:&
$>:@=?v1+&:&"*"o
0f]oa~<.

Try it here!

This was fun to write, though a bit more bytes than I expected.

\$\endgroup\$
1
\$\begingroup\$

Sinclair ZX81/Timex TS1000/1500, 117 bytes (listing)

1 PRINT "NUMBER OF * TO SHOW?"
2 INPUT A
3 IF A<1 THEN STOP
4 LET J=A/A
5 FOR I=1 TO A
6 FOR X=1 TO J
7 PRINT "*";
8 NEXT X
9 LET J=J+1
10 PRINT
11 NEXT I

Note that because the screen scroll isn't handled in this program listing, you may only enter a number between 0 and 22 because as soon as the ZX81 hits the bottom of the screen it will halt the program. You can see the missing * by using CONT when this happens, but also note that the ZX81 only has 32 columns text by default in BASIC.

\$\endgroup\$
  • \$\begingroup\$ To save actual (system) bytes, you may amend the following lines: 3 IF A<CODE "{GRAPHICS ON}{SHIFT}1{SHIFT OFF}{GRAPHICS OFF}" 5 FOR I=PI/PI TO A 6 FOR X=PI/PI TO J 9 LET J=J+PI/PI \$\endgroup\$ – Shaun Bebbers Feb 27 '17 at 9:42
1
\$\begingroup\$

SQL, 80 bytes

DECLARE @i INT=1,@ INT=5WHILE @i<>@ BEGIN PRINT REPLICATE('*',@i)SET @i=@i+1 END

ungolfed:

DECLARE @index INT=1, 
        @rows INT=5

WHILE @index<>@rows 
BEGIN 
    PRINT REPLICATE('*',@index)
    SET @index=@index+1 
END
\$\endgroup\$
1
\$\begingroup\$

Rebol, 32 bytes

loop do input[print append{}"*"]

Ungolfed:

loop do input [
    print append {} "*"
]
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.