this post was submitted on 23 Jun 2023
9 points (100.0% liked)

Code Golf

166 readers
1 users here now

Icon base by Delapouite under CC BY 3.0 with modifications to add a gradient

founded 1 year ago
MODERATORS
 

Write a function that prints an n big tree, e.g. for n=5:

     * 
    * * 
   * * * 
  * * * * 
 * * * * * 
    | |

Here is what I came up with in C:

N,i;a(n){for(i=N=N?N:n+2;i--;printf(i?"* "+(N-n-1<i):--n?"\n":"\n%*s",N,"| |"));n&&a(n);}

// the invocation isn't part of the golf:
main(){a(5);}

PS: Code blocks currently wrap around when they are too long, I've already submitted a patch to make them scroll horizontally instead.

you are viewing a single comment's thread
view the rest of the comments
[โ€“] [email protected] 4 points 1 year ago* (last edited 1 year ago) (1 children)

Poor ChatGPT, it's always so close but so far. This doesn't meet spec :)

It doesn't print the bottom row of ' | | ', and it misses the leading spaces.

Fixing it produces:

def p(n):print('\n'.join(' '*(n-i)+'* '*(i+1)+' '*(n-i-1) for i in range(0,n)));print(' '*(n-1)+'| |')

Which is 102 characters, so longer than before. Like I said, I tried the list comp route. You get rid of some stuff, but you add more unfortunately.

However, both me and ChatGPT made the mistake of printing spaces after, which tbh isn't necessary. That can give a bit of a boost:

def p(n):print('\n'.join(' '*(n-i)+'* '*(i+1) for i in range(0,n)));print(' '*(n-1)+'| |')

Which is 90, but applying it to my og answer:

def a(n):
 for i in range(0,n):
  print(' '*(n-i)+'* '*(i+1))
 print(' '*(n-1)+'| |')

Yields 82.

Putting the loop on one line saves a couple characters though:

def a(n):
 for i in range(0,n):print(' '*(n-i)+'* '*(i+1))
 print(' '*(n-1)+'| |')

Gets it to 80

[โ€“] [email protected] 4 points 1 year ago

Oh I totally missed that the trunk was part of the spec, gotta fix my own answer too