Kode Golf Edisi Natal: Cara mencetak pohon Natal dengan tinggi N

89

Diberi nomor N, bagaimana saya bisa mencetak pohon Natal tinggi Nmenggunakan paling sedikit karakter kode? Ndiasumsikan dibatasi pada nilai minimum 3, dan nilai maksimum 30(batas dan pengecekan error tidak diperlukan). Ndiberikan sebagai satu-satunya argumen baris perintah untuk program atau skrip Anda.

Semua bahasa dihargai, jika Anda melihat bahasa sudah diterapkan dan Anda dapat mempersingkat, edit jika mungkin - komentar sebaliknya dan berharap seseorang membersihkan kekacauan. Sertakan baris baru dan Spasi Putih untuk kejelasan, tetapi jangan memasukkannya dalam jumlah karakter.

Pohon Natal dihasilkan seperti itu, dengan "belalainya" yang hanya terdiri dari "*" terpusat

N = 3:

   *
  ***
 *****
   *

N = 4:

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

N = 5:

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

N mendefinisikan tinggi cabang yang tidak termasuk batang satu baris.

Selamat PPCG Natal!

Perangkat LunakJedi
sumber

Jawaban:

46

J , 24 karakter

(,{.)(}:@|."1,.])[\'*'$~

   (,{.)(}:@|."1,.])[\'*'$~5
    *    
   ***   
  *****  
 ******* 
*********
    *    

Penjelasan:

'*'$~5
*****

[\'*'$~5
*    
**   
***  
**** 
*****

Kemudian }:@|."1membalikkan setiap baris dan melepas kolom terakhir, dan ,.staples ke ].

Lalu ,{.tempelkan kolom pertama ke bawah.

Entri sebelumnya :

29 karakter, tanpa spasi sama sekali.

   ((\: i. @ #),}.) "1 $ & '*'" 0>: 0, ~ i.3
  *
 ***
*****
  *
   ((\: i. @ #),}.) "1 $ & '*'" 0>: 0, ~ i.11
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   *****************
  *******************
 *********************
***********************
          *

   NB. hitung dari 1 hingga n , lalu 1 lagi
   >: 0, ~ i.3
1 2 3 1
   NB. replikasi '*' x masing-masing kali
   $ & '*' "0>: 0, ~ i.3
*
**
***
*
   NB. membalikkan setiap baris
   (\: i. @ #) "1 $ & '*'" 0>: 0, ~ i.3
  *
 **
***
  *
   NB. lepaskan kolom terkemuka
   }. "1 $ & '*'" 0>: 0, ~ i.3

*
**

   NB. rekatkan
   ((\: i. @ #),}.) "1 $ & '*'" 0>: 0, ~ i.3
  *
 ***
*****
  *
singkat
sumber
Dengan hanya 9 karakter lagi Anda dapat memberi fungsi ini nama:c=:[:((\:i.@#),}.)"1[:$&'*'"0[:>:0,~i.
ephemient
11
Apa, apakah Anda menggunakan semacam perpustakaan dokumentasi J untuk memahami kode? :)
92

Brainfuck, 240 karakter

              ,
             >++
            +++++
           +[-<---
          --->],[>+
         +++++++[-<-
        ----->]<<[->+
       +++++++++<]>>]<
      [->+>+>>>>>>>+<<<
     <<<<<<]>>>>++++++++
    [-<++++>]>++++++[-<++
   +++++>]+>>>++[-<+++++>]
  <<<<<<[-[>.<-]<[-<+>>+<]<
 [->+<]>>>>>[-<.>>+<]>[-<+>]
>.<<++<<<-<->]>>>>>>>-[-<<<<<
           <.>>>
           >>>]<
           <<<<.

Belum selesai. Ini bekerja, tetapi hanya dengan angka satu digit.

EDIT: Selesai! Bekerja untuk penerjemah menggunakan 0 sebagai EOF. Lihat NOTEs dalam sumber komentar untuk mereka yang -1.

Sunting lagi: Saya harus mencatat bahwa karena Brainfuck tidak memiliki metode standar untuk membaca argumen baris perintah, saya menggunakan stdin (input standar) sebagai gantinya. ASCII, tentu saja.

EDIT ketiga kalinya: Ya ampun, sepertinya saya menanggalkan .(output) karakter ketika mengkondensasi kode. Tetap...

Inilah manajemen memori dasar dari loop utama. Saya yakin ini bisa sangat dioptimalkan untuk mengurangi jumlah karakter sekitar 30 atau lebih.

  1. Sementara
  2. Salinan konter
  3. Penghitung (dihitung 0)
  4. Karakter spasi (desimal 32)
  5. Karakter tanda bintang (desimal 42)
  6. Jumlah tanda bintang pada baris saat ini (penghitung 1 + 2 *)
  7. Sementara
  8. Karakter baris baru
  9. Sementara?
  10. Jumlah total garis (yaitu nilai input; disimpan hingga akhir, saat mencetak bagasi)

Versi kental:

,>++++++++[-<------>],[>++++++++[-<------>]<<[->++++++++++<]>>]<[->+>+>>>>>>>+<<<<<<<<<]>>>>++++++++[-<++++>]>++++++[-<+++++++>]+>>>++[-<+++++>]<<<<<<[-[>.<-]<[-<+>>+<]<[->+<]>>>>>[-<.>>+<]>[-<+>]>.<<++<<<-<->]>>>>>>>-[-<<<<<<.>>>>>>]<<<<<.

Dan versi cantiknya:

ASCII to number
,>
++++++++[-<------>]  = 48 ('0')

Second digit (may be NULL)
,
NOTE:   Add plus sign here if your interpreter uses negative one for EOF
[ NOTE: Then add minus sign here
 >++++++++[-<------>]
 <<[->++++++++++<]>>  Add first digit by tens
]

Duplicate number
<[->+>+>>>>>>>+<<<<<<<<<]>>

Space char
>>++++++++[-<++++>]

Asterisk char
>++++++[-<+++++++>]

Star count
+

New line char
>>>++[-<+++++>]<<<

<<<

Main loop
[
Print leading spaces
-[>.<-]

Undo delete
<[-<+>>+<]
<[->+<]
>>

Print stars
>>>[-<.>>+<]

Add stars and print new line
>[-<+>]
>.<
<++

<<<

-<->
End main loop
]

Print the trunk
>>>>>>>
-[-<<<<<<.>>>>>>]
<<<<<.

Merry Christmas =)
jrtapsell
sumber
1
otak saya terasa f ..... sakit
3
Ya Tuhan.
pengecut anonim
63

Perl, 50 karakter

(1 ruang yang relevan)

perl: satu versi baris:

print$"x($a-$_),'*'x($_*2+1),$/for 0..($a=pop)-1,0

dan sekarang dengan whitesapce lebih banyak:

print $"  x ( $a - $_ ),             #"# Syntax Highlight Hacking Comment
      '*' x ( $_ * 2  + 1),
      $/
for 0 .. ( $a = pop ) - 1, 0;

$ perl tree.pl 3
   *
  ***
 *****
   *
$ perl tree.pl 11
           *
          ***
         *****
        *******
       *********
      ***********
     *************
    ***************
   *****************
  *******************
 *********************
           *
$ 

Penjelasan yang Diperluas untuk Pengguna Non-Perl.

# print $Default_List_Seperator ( a space )  
#     repeated ( $a - $currentloopiterationvalue ) times,
print $" x ( $a - $_ ), 
#"# print '*' repeated( $currentloopiteration * 2 + 1 ) times. 
  '*' x ( $_ * 2  + 1),
# print $Default_input_record_seperator ( a newline )
  $/
# repeat the above code, in a loop, 
#   iterating values 0 to ( n - 1) , and then doing 0 again
for 0 .. ( $a = pop ) - 1, 0;
# prior to loop iteration, set n to the first item popped off the default list, 
#   which in this context is the parameters passed on the command line. 
MkV
sumber
25
Omong kosong ... perl benar-benar tidak dapat dibaca.
8
@zenazn, juga, harus diperhatikan bahwa sebagian besar golf adalah kode BAD dalam bahasa apa pun. Jika ini adalah kompetisi untuk kode terbersih, kita bisa memenangkannya juga.
Kent Fredric
5
@zenazn: bukti, Anda dapat melihat kami berkolaborasi dan meningkatkan satu sama lain kode di atas, ini membuktikan KAMI dapat membaca SETIAP kode LAIN-LAIN dengan sangat baik.
Kent Fredric
1
PS: Terima kasih atas penjelasan untuk programmer non-Perl. Ini masih belum terbaca, tapi setidaknya itu masuk akal. Saya kira Anda terbiasa setelah beberapa saat.
2
@RobH: J adalah anak APL. Dalam beberapa hal, ini lebih tidak dapat dibaca karena tidak menggunakan set karakter APL dengan simbol khusus untuk setiap operasi - malah membebani karakter ASCII dengan banyak makna. stackoverflow.com/questions/392788/1088931#1088931
ephemient
26

Bahasa: Python (melalui shell), Jumlah Char: 64 (2 spasi signifikan)

python -c "
n=w=$1
s=1
while w:
    print' '*w+'*'*s
    s+=2
    w-=1
print' '*n+'*'"

$ sh ax6 11
           *
          ***
         *****
        *******
       *********
      ***********
     *************
    ***************
   *****************
  *******************
 *********************
           *
tzot
sumber
8
Yang paling saya sukai dari solusi ini adalah bahwa python membuatnya sangat sulit untuk menulis kode yang tidak jelas, ini adalah salah satu solusi yang paling mudah dibaca
Anda menggunakan shell untuk memproses argumen, yang tidak sesuai dengan kode IMO golf. Menggunakan "import sys" dan "n = w = int (sys.argv [1])" dan sebuah indent dari 1 karakter untuk loop body, saya menghasilkan 89 karakter untuk versi ini.
4
Inilah yang saya lakukan sebelumnya. Semangat pertanyaan ini adalah untuk bersenang-senang, dan di samping itu tidak ada spesifikasi menggunakan hanya satu bahasa :) Lihat jawaban brainfuck, misalnya; tidak ada argumen.
26

x86 asm 16-bit, 50 byte

Belum ada versi perakitan? :)

    bits 16
    org 100h

    mov si, 82h
    lodsb
    aaa
    mov cx, ax
    mov dx, 1
    push cx 
    mov al, 20h
    int 29h
    loop $-2
    push dx
    mov al, 2ah
    int 29h
    dec dx
    jnz $-3
    pop dx
    mov al, 0ah
    int 29h
    inc dx
    inc dx
    pop cx
    loop $-23
    shr dx, 1
    xchg cx, dx
    mov al, 20h
    int 29h
    loop $-2
    mov al, 2ah
    int 29h
    ret

(Catatan: N terbatas pada 1 - 9 dalam versi ini)

G:\>tree 9
         *
        ***
       *****
      *******
     *********
    ***********
   *************
  ***************
 *****************
         *

Unduh disini

Jonas Gulle
sumber
24

Bahasa: Skrip Batch Windows ( mengejutkan! )

@echo off
echo Enable delayed environment variable expansion with CMD.EXE /V

rem Branches
for /l %%k in (1,1,%1) do (
set /a A=%1 - %%k
set /a B=2 * %%k - 1
set AA=
for /l %%i in (1,1,!A!) do set "AA=!AA! "
set BB=
for /l %%i in (1,1,!B!) do set BB=*!BB!
echo !AA!!BB!
)

rem Trunk
set /a A=%1 - 1
set AA=
for /l %%i in (1,1,!A!) do set "AA=!AA! "
echo !AA!*

sumber
masokis! Saya suka
Sangat bagus ... Anda mendapatkan +1
2
Ekspansi variabel yang tertunda dapat diaktifkan menggunakan setlocal enabledelayedexpansionperintah.
Helen
kawan serius?
Tidak bisa membuatnya bekerja Pertama kali saya coba.
Fabinout
21

Ruby, 64 byte

n=ARGV[0].to_i
((1..n).to_a+[1]).each{|i|puts' '*(n-i)+'*'*(2*i-1)}

n=$*[0].to_i
((1..n).to_a<<1).each{|i|puts' '*(n-i)+'*'*(2*i-1)}

Selamat Natal semua!

Sunting: Perbaikan ditambahkan seperti yang disarankan oleh Joshua Swink

jrtapsell
sumber
dang aku berharap belum ada yang mencobanya di ruby. pekerjaan yang baik.
Ini adalah baris yang sangat bagus dari Ruby.
Apakah saya tampak terlalu kasar? Maaf, bukan niat saya! Selamat XMas! :)
Bukan berarti jahat juga, dan tentu saja Anda benar! Selamat Hari Natal!
1
Pada 1.9, Anda dapat menyimpan lebih banyak karakter: n=$*[0].to_i;puts [*1..n,1].map{|i|" "*(n-i)+"*"*(2*i-1)}membawanya ke 58.
14

Bahasa: C #, Jumlah Char: 120

static void Main(string[] a)
{
    int h = int.Parse(a[0]);

    for (int n = 1; n < h + 2; n++)
        Console.WriteLine(n <= h ?
            new String('*', n * 2 - 1).PadLeft(h + n) :
            "*".PadLeft(h + 1));
    }
}

Hanya kode, tanpa pemformatan (120 karakter):

int h=int.Parse(a[0]);for(int n=1;n<h+2;n++)Console.WriteLine(n<=h?new String('*',n*2-1).PadLeft(h+n):"*".PadLeft(h+1));

Versi dengan 109 karakter (hanya kode):

for(int i=1,n=int.Parse(a[0]);i<n+2;i++)Console.WriteLine(new String('*',(i*2-1)%(n*2)).PadLeft((n+(i-1)%n)));

Hasil untuk tinggi = 10:

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

sumber
13

Bahasa: dc (melalui shell) Jumlah Char: 83

Versi dc yang sedikit lebih pendek:

dc -e '?d1rdsv[d32r[[rdPr1-d0<a]dsaxszsz]dsbx1-rd42rlbx2+r10Plv1-dsv0<c]dscxszsz32rlbx[*]p' <<<$1

EDIT: berubah konstan 10 menjadi $ 1

Hynek -Pichi- Vychodil
sumber
11
Tuan yang baik, apa-apaan itu?
1
Hanya membaca halaman manual ;-)
12

trik python, "-c" ... @ 61 karakter (dan satu baris)

python -c"for i in range($1)+[0]:print' '*($1-i)+'*'*(2*i+1)"

sumber
Sebenarnya, ini 57 karakter, hanya ruang '' yang signifikan sesuai spesifikasi pertanyaan.
10

Berikut ini adalah versi Haskell yang hemat-ruang, pada 107 karakter:

main=interact$(\g->unlines$map(\a->replicate(g-a)' '++replicate(a*2-1)'*')$[1..g]++[1]).(read::[Char]->Int)

menjalankannya:

$ echo 6 | runhaskell tree.hs
     *
    ***
   *****
  *******
 *********
***********
     *

Selamat Natal, semuanya :)


sumber
10

Bahasa: dc (melalui shell), Jumlah Char: 119 (1 spasi signifikan)

Hanya untuk ketidakjelasan itu :)

dc -e "$1dsnsm"'
[[ ]n]ss
[[*]n]st
[[
]n]sl
[s2s1[l2xl11-ds10<T]dsTx]sR
[lndlslRxlcdltlRxllx2+sc1-dsn0<M]sM
1sclMxlmlslRxltxllx
'

$ sh ax3 10
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
          *
tzot
sumber
Uhm serius, wtf? Saya tidak mengerti satu baris pun dari itu: P
dc adalah kalkulator reverse-polish. 'man dc' adalah cara yang jelas untuk pergi :)
6

Lebih baik C ++, sekitar 210 karakter:

#include <iostream>
using namespace std;
ostream& ChristmasTree(ostream& os, int height) {
    for (int i = 1; i <= height; ++i) {
        os << string(height-i, ' ') << string(2*i-1, '*') << endl;
    }
    os << string(height-1, ' ') << '*' << endl;
    return os;
}

Minimalkan ke 179:

#include <iostream>
using namespace std;ostream& xmas(ostream&o,int h){for(int i=1;i<=h;++i){o<<string(h-i,' ')<<string(2*i-1,'*')<<endl;}o<<string(h-1,' ')<<'*'<<endl;return o;}

sumber
menggunakan std; siapa saja?
strager - ketika saya mulai hanya ada pasangan std :: 's dan' using namespace std; ' banyak teks. Saya kira sekarang itu akan lebih sedikit karakter.
Versi Anda lebih tidak efisien daripada versi saya, karena harus membuat string, versi saya hanya mencetak karakter yang dibutuhkan. :)
pyon
6

Bahasa: python, tanpa trik, 78 karakter

import sys
n=int(sys.argv[1])
for i in range(n)+[0]:print' '*(n-i)+'*'*(2*i+1)

sumber
6

Groovy 62B

n=args[0]as Long;[*n..1,n].any{println' '*it+'*'*(n-~n-it*2)}

_

n = args[0] as Long
[*n..1, n].any{ println ' '*it + '*'*(n - ~n - it*2) }

sumber
5

Meningkatkan jawaban ΤΖΩΤΖΙΟΥ. Saya tidak bisa berkomentar, jadi di sini ada posting baru. 72 karakter.

import sys
n=int(sys.argv[1])
for i in range(n)+[0]:
   print ("*"*(2*i+1)).center(2*n)

Menggunakan trik "python -c", 61 karakter.

python -c "
for i in range($1)+[0]:
   print ('*'*(2*i+1)).center(2*$1)
"

Saya mempelajari fungsi pusat dan "python -c" dapat menerima lebih dari satu kode baris. Terima kasih, ΤΖΩΤΖΙΟΥ.


sumber
5

C # menggunakan Linq:

    using System;
    using System.Linq;
    class Program
        {
            static void Main(string[] args)
            {
                int n = int.Parse(args[0]);
                int i=0;
                Console.Write("{0}\n{1}", string.Join("\n", 
                   new int[n].Select(r => new string('*',i * 2 + 1)
                   .PadLeft(n+i++)).ToArray()),"*".PadLeft(n));
            }
       }

170 karakter.

int n=int.Parse(a[0]);int i=0;Console.Write("{0}\n{1}",string.Join("\n",Enumerable.Repeat(0,n).Select(r=>new string('*',i*2+1).PadLeft(n+i++)).ToArray()),"*".PadLeft(n));

sumber
5

AWK, 86 karakter dalam satu baris.

awk '{s="#";for(i=0;i<$1;i++){printf"%"$1-i"s%s\n","",s;s=s"##"}printf"%"$1"s#\n",""}'

echo "8" | awk '{s="#";for(i=0;i<$1;i++){printf"%"$1-i"s%s\n","",s;s=s"##"}printf"%"$1"s#\n",""}'
        #
       ###
      #####
     #######
    #########
   ###########
  #############
 ###############
        #

cat tree.txt
3
5

awk '{s="#";for(i=0;i<$1;i++){printf"%"$1-i"s%s\n","",s;s=s"##"}printf"%"$1"s#\n",""}' tree.txt
   #
  ###
 #####
   #
     #
    ###
   #####
  #######
 #########
     #

sumber
5

Bahasa: Java, Jumlah Char: 219

class T{ /* 219 characters */
  public static void main(String[] v){
    int n=new Integer(v[0]);
    String o="";
    for(int r=1;r<=n;++r){
      for(int s=n-r;s-->0;)o+=' ';
      for(int s=1;s<2*r;++s)o+='*';
      o+="%n";}
    while(n-->1)o+=' ';
    System.out.printf(o+"*%n");}}

Sebagai referensi, saya dapat mencukur solusi Java sebelumnya, menggunakan rekursi, hingga 231 karakter, dari minimum sebelumnya 269. Meskipun sedikit lebih lama, saya suka solusi ini karena Tbenar-benar berorientasi objek. Anda bisa membuat hutan kecil Tcontoh berukuran acak . Berikut adalah evolusi terbaru pada taktik itu:

class T{ /* 231 characters */
  public static void main(String[] v){new T(new Integer(v[0]));}}
  String o="";
  T(int n){
    for(int r=1;r<=n;++r){
      x(' ',n-r);x('*',2*r-1);o+="%n";}
    x(' ',n-1);
    System.out.printf(o+"*%n");
  }
  void x(char c,int x){if(x>0){o+=c;x(c,x-1);}
 }
joel.neely
sumber
Hitungan karakter baru Anda adalah 251 (1 ruang yang relevan)
singkirkan "public static void main", gunakan blok statis dan kompilasi dengan java 6;)
Fabinout
Saya tahu ini sudah hampir 9 tahun (lol ..) tetapi Anda dapat bermain golf beberapa hal: class T{public static void main(String[]v){long n=new Long(v[0]),r=1,s;String o="";for(;r<=n;r++){for(s=n-r;s-->0;)o+=' ';for(;++s<2*r;)o+='*';o+="\n";}while(n-->1)o+=' ';System.out.println(o+"*");}}(199 karakter / byte)
Kevin Cruijssen
5

Bahasa: PowerShell, Hitungan Char: 41 (termasuk 1 spasi)

1..$args[0]+1|%{" "*(30-$_)+"*"*($_*2-1)}
Jaykul
sumber
5

21 karakter dengan dyalog APL.

m,⍨⌽0 1↓m←↑'*'\¨⍨1,⍨⍳

⍳ memberikan vektor bilangan bulat dimulai dengan 1.

1, ⍨ menambahkan satu ke ujung vektor. Ini akan menjadi kaki pohon.

'*' \ ¨⍨ memberikan vektor * -strings dengan panjang yang diberikan oleh vektor sebelumnya.

↑ mentransformasikan vektor ke matriks dan menambahkan spasi ke kanan.

m ← menyimpan matriks dalam m.

0 1 ↓ turun nol baris dan kolom pertama.

⌽ membalikkan matriks.

m, ⍨ bergabung dengan m di sisi kanan.

pengguna10639
sumber
m,⍨⌽0 1↓m←->(⌽,0 1↓⊢)
ngn
4

Bahasa: C, Jumlah Char: 133

Peningkatan versi C.

char s[61];

l(a,b){printf("% *.*s\n",a,b,s);}

main(int i,char**a){
  int n=atoi(a[1]);memset(s,42,61);
  for(i=0;i<n;i++)l(i+n,i*2+1);l(n,1);
}

Bekerja dan bahkan mengambil ketinggian pohon sebagai argumen. Membutuhkan kompiler yang mentolerir kode gaya K&R.

Saya merasa sangat kotor sekarang .. Ini kode yang jelek.


sumber
Ini memiliki masalah yang sama dengan potongan pertama saya di Jawa; itu bukan program lengkap dengan penggunaan argumen baris perintah!
Oh Apakah ini wajib? Tidak masalah. Saya akan memperbaikinya.
Ini 138 karakter ketika semua baris baru yang tidak perlu dihapus.
Can Berk Güder
Saya menghitung 133 (baru saja menghapus semua spasi putih dan memeriksa filesize)
4

R (62 byte)

Saya belum melihat solusi R. Perbaiki saya jika saya melewatkannya.

for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")

Keluaran:

> N <- 3
> for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")
  *
 ***
*****
  *
> 
> N <- 4
> for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")
   *
  ***
 *****
*******
   *
> 
> N <- 5
> for(i in c(1:N,1))cat(rep(" ",N-i),rep("*",2*i-1),"\n",sep="")
    *
   ***
  *****
 *******
*********
    *
djhurio
sumber
3

Bahasa: C, Hitung Char: 176 (2 spasi relevan)

#include <stdio.h>
#define P(x,y,z) for(x=0;x++<y-1;)printf(z);
main(int c,char **v){int i,j,n=atoi(v[1]);for(i=0;i<n;i++){P(j,n-i," ")P(j,2*i+2,"*")printf("\n");}P(i,n," ")printf("*\n");}
Bisa Berk Güder
sumber
3

Versi shell, 134 karakter:

#!/bin/sh
declare -i n=$1
s="*"
for (( i=0; i<$n; i++ )); do
    printf "%$(($n+$i))s\n" "$s"
    s+="**"
done
printf "%$(($n))s\n" "*"

sumber
bermain golf
3

Bahasa: Python, Jumlah char signifikan: 90

Itu jelek tapi berhasil:

import sys
n=int(sys.argv[1])
print"\n".join(" "*(n-r-1)+"*"*(r*2+1)for r in range(n)+[0])

...

$ python tree.py 13
            *
           ***
          *****
         *******
        *********
       ***********
      *************
     ***************
    *****************
   *******************
  *********************
 ***********************
*************************
            *

sumber
Hitungan karakter Anda adalah 98 (2 spasi signifikan, yang ada dalam tanda kutip)
3

Karena ini adalah CW: Saya tidak suka kode golf selalu diatur dalam "jumlah karakter" atau semacamnya. Tidak bisakah mereka disusun berdasarkan jumlah instruksi untuk kompiler / juru bahasa (atau kriteria serupa)? Ini adalah solusi Ruby lagi , dan pada dasarnya sama, tetapi sekarang untuk konsumsi manusia juga:

SPACE = " "
ASTERISK = "*"
height_of_tree=ARGV[0].to_i
tree_lines = (1..height_of_tree).to_a
tree_lines.push 1 # trunk
tree_lines.each do | line |
   spaces_before = SPACE*(height_of_tree-line)
   asterisks = ASTERISK*(2*line-1) 
   puts spaces_before + asterisks
end
Komunitas
sumber
Saya setuju dengan pernyataan pertama. Dalam istilah seperti itu, bahasa seperti perl memiliki keunggulan awal. Harus berupa jumlah statemetns atau sejenisnya.
terima kasih ... saya mengajukan pertanyaan tentang golf kemarin dan cara melakukannya mungkin dengan "token" ... nama panjang dan sebagainya tidak dikenakan sanksi.
2

PHP, 111 karakter

(Char terakhir harus menjadi baris baru.)

<?php $n=$argv[1];for($r='str_repeat';$i<$n;$i++)echo $r(' ',$n-$i).$r('*',$i*2+1)."\n";echo $r(' ',$n).'*' ?>

Versi yang dapat dibaca:

<?php

$n = $argv[1];

for ($r = 'str_repeat'; $i < $n; $i++)
    echo $r(' ', $n - $i) . $r('*' , $i * 2 + 1) . "\n";

echo $r(' ', $n) . '*'

?>

sumber
Anda dapat menyimpan beberapa karakter dengan membuat string, lalu menggemakannya. Kupikir. Cobalah itu.
Ide bagus, tapi saya mencobanya dan itu hanya membuatnya lebih lama. '$ t. = (...)' hanya satu karakter lebih pendek dari 'echo (...)', dan kemudian Anda harus 'echo $ t' di akhir juga.
Dipersingkat dengan 4 karakter dengan menghapus '$ i = 0;' bagian pertama dari pernyataan for. PHP mengasumsikan bahwa tidak ada variabel yang digunakan dalam konteks integer sudah 0! : P
Menyimpan char dengan meletakkan $ r = .. di dalam for. Juga, saya katakan karakter baris baru harus satu byte, bukan dua. =]
Ya saya baru sadar saya salah menghitung satu karena saya menghitung menggunakan nomor kolom di editor teks saya. Saya menggunakan linux sehingga char baris baru adalah satu byte.