Code Golf Christmas Edition: N yüksekliğinde bir Noel ağacı nasıl yazdırılır


89

Bir sayı verildiğinde N, Nen az sayıda kod karakterini kullanarak bir Noel ağacı yüksekliğini nasıl yazdırabilirim ? Nminimum değer 3ve maksimum değer ile sınırlandırılmış kabul edilir 30(sınırlar ve hata kontrolü gerekli değildir). Nprogramınıza veya komut dosyasına tek ve tek komut satırı argümanı olarak verilir.

Tüm diller takdir, zaten uygulanmış bir dil görürseniz ve onu daha kısa hale getirebilirseniz, mümkünse düzenleyin - aksi halde yorum yapın ve birilerinin karışıklığı temizlemesini umun. Netlik için yeni satırlar ve Beyaz Boşluklar ekleyin, ancak bunları karakter sayısına dahil etmeyin.

Bir Noel ağacı, yalnızca merkezlenmiş bir "*" den oluşan "gövdesi" ile olduğu gibi üretilir.

N = 3:

   *
  ***
 *****
   *

N = 4:

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

N = 5:

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

N, bir hat gövdesi içermeyen dalların yüksekliğini tanımlar.

Mutlu Noeller PPCG!

Yanıtlar:


46

J , 24 karakter

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

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

Açıklama:

'*'$~5
*****

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

Sonra }:@|."1her satırı tersine çevirir ve son sütunu ,.çıkarır ve zımbalar ].

Sonra ,{.ilk sütunu dibe yapıştırır.

Önceki girişler :

29 karakter, hiç boşluk yok.

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

   NB. 1'den n'ye kadar say , sonra tekrar 1
   > 0, ~ I.3
1 2 3 1
   NB. her birinde '*' x kez çoğalt
   $ & '*' "0>: 0, ~ i.3'de
*
**
***
*
   NB. her satırı ters çevir
   (\:. İ @ #) "1 $ & '*'" 0>: 0, ~ i.3'de
  *
 **
***
  *
   NB. önde gelen sütunu çıkarmak
   } "1 $ & '*'" 0>:. 0, ~ i.3'de

*
**

   NB. birbirine yapıştırmak
   ((\:. İ @ #),}). "1 $ & '*'" 0>: 0, ~ i.3'de
  *
 ***
*****
  *

Sadece 9 karakter daha bu fonksiyona bir isim verebilirsiniz:c=:[:((\:i.@#),}.)"1[:$&'*'"0[:>:0,~i.
ephemient

11
Ne, siz beyler kodu anlayabilmek için bir çeşit J dökümantasyon kütüphanesi kullanıyor musunuz? :)

92

Brainfuck, 240 karakter

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

Henüz yapılmadı. Çalışır, ancak yalnızca tek basamaklı sayılarla.

EDIT: Tamam! 0'ı EOF olarak kullanan tercümanlar için çalışır. NOTE-1 olanlar için yorumlanmış kaynaktaki s'e bakınız .

Tekrar EDIT: Brainfuck komut satırı argümanlarını okumak için standart bir yöntemden yoksundur, bunun yerine stdin (standart girdi) kullandım. Tabii ki ASCII.

Üçüncü kez DÜZENLE: Ah canım, .kod yoğunlaştırırken karakterleri çıkardı (çıkış) görünüyor . Sabit...

İşte ana döngünün temel bellek yönetimi. Karakter sayısını 30 ya da daha fazla azaltmak için yoğun olarak optimize edilebildiğinden eminim.

  1. Geçici
  2. Sayacın kopyası
  3. Sayaç (0'a kadar sayılır)
  4. Boşluk karakteri (ondalık 32)
  5. Yıldız karakteri (ondalık 42)
  6. Geçerli satırdaki yıldız sayısı (1 + 2 * sayaç)
  7. Geçici
  8. Yeni çizgi karakter
  9. Geçici?
  10. Toplam satır sayısı (yani giriş değeri; gövdeyi yazdırırken en sonuna kadar saklanır)

Yoğunlaştırılmış versiyon:

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

Ve güzel versiyon:

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

1
beynim f hissediyor ..... hasta

3
Aman Tanrım.
anonim korkak

63

Perl, 50 karakter

(1 ilgili alan)

perl: bir satır versiyonu:

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

ve şimdi daha fazla boşlukla:

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

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

Perl-olmayan kullanıcılar için genişletilmiş açıklama.

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

25
Kutsal bok ... perl gerçekten okunamıyor.

8
@zenazn, ayrıca, çoğu golfün herhangi bir dilde KÖTÜ kodu olduğu fark edilmelidir. Bu en temiz kod için bir rekabet olsaydı, biz de kazanabilirdik.
Kent Fredric

5
@zenazn: geçirmez, bizi işbirliği ve yukarıda birbirlerinin kod geliştirmeye görebilirsiniz bu kanıtlıyor BİZ okuyabilir HER DİĞERLERİ kod mükemmel iyi.
Kent Fredric

1
Not: Perl dışındaki programcıların açıklamaları için teşekkürler. Hala oldukça okunaksız ama en azından mantıklı. Sanırım bir süre sonra alışırsın.

2
@RobH: J, APL'nin çocuğudur. Bazı açılardan daha okunaklı değildir çünkü APL karakter kümesini her işlem için özel bir sembolle kullanmaz - ASCII karakterlerini çoklu anlamlarla aşırı yükler. stackoverflow.com/questions/392788/1088931#1088931
ephemient

26

Dil: Python (kabuğun içinden), Karakter sayısı: 64 (2 önemli boşluk)

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

$ sh ax6 11
           *
          ***
         *****
        *******
       *********
      ***********
     *************
    ***************
   *****************
  *******************
 *********************
           *

8
Bu çözümle ilgili en çok sevdiğim şey python'un belirsiz kod yazmayı gerçekten zorlaştırması, en okunaklı çözümlerden biri

IMO kodlu golf ruhunda bulunmayan tartışmayı işlemek için kabuğu kullanıyorsunuz. "İmport sys" ve "n = w = int (sys.argv [1])" ve döngü gövdesi için 1 karakterlik bir girinti kullanarak, bu sürüm için 89 karakterle geldim.

4
Daha önce de böyle yaptım. Bu sorunun ruhu eğlenmek ve ayrıca ek olarak sadece bir dil kullanmanın hiçbir özelliği yoktu :) Örneğin, beyin fırtınası cevabına bakınız; tartışma yok.

26

x86 asm 16 bit, 50 bayt

Henüz montaj sürümü yok mu? :)

    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

(Not: Bu sürümde N, 1 - 9 ile sınırlıdır)

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

Buradan indirin


24

Dil: Windows Toplu Komut Dosyası ( şok edici! )

@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!*

mazoşist! Hoşuma

Very nice ... +1

2
Gecikmeli değişken genişlemesi setlocal enabledelayedexpansionkomut kullanılarak etkinleştirilebilir .
Helen,

kanka. ciddi anlamda?

İşe yaramaz. İlk defa olsa deniyorum.
Fabinout

21

Ruby, 64 bayt

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

Herkese mutlu Noeller!

Düzenleme: Joshua Swink tarafından önerilen şekilde eklenen iyileştirmeler


dang henüz kimsenin yakutta denemediğini umuyordum. iyi iş.

Bu çok güzel bir Ruby hattı.

Çok abartmış mıydım? Üzgünüm, niyetim değil! Mutlu Noeller! :)

Kastettiğim anlamına gelmiyordu ve elbette haklıydın! Mutlu Noeller!

1
1.9'da, biraz daha fazla para kazanabilirsiniz: n=$*[0].to_i;puts [*1..n,1].map{|i|" "*(n-i)+"*"*(2*i-1)}58'e

14

Dil: C #, Char sayısı: 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));
    }
}

Biçimlendirme olmadan sadece kod (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));

109 karakterden oluşan versiyon (sadece kod):

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

Yükseklik için sonuç = 10:

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

13

Dil: dc (kabuğun içinden) Karakter sayısı: 83

Biraz daha kısa dc versiyonu:

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

EDIT: 10 değişmezi 1 $ olarak değiştirdi


11
Tanrım, bu da ne?

1
Sadece man sayfasını okuyun ;-)

12

python, "-c" numarası ... @ 61 karakter (ve bir satır)

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

Aslında, 57 karakterden oluşuyor, soru spesifikasyonuna göre sadece '' boşluğu var.

10

İşte 107 karakterde oldukça az yer kaplayan bir Haskell sürümü:

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

çalıştırıyor:

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

Herkese mutlu Noeller :)


10

Dil: dc (kabuğun içinden), Karakter sayısı: 119 (1 önemli alan)

Sadece onun belirsizliği için :)

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

$ sh ax3 10
          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************
          *

Uhm ciddi, wtf? Bunun tek bir satırını anlamıyorum: P

dc bir ters cila hesaplayıcısıdır. 'Man dc' gitmenin en bariz yolu :)

6

Daha iyi C ++, yaklaşık 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;
}

179'a küçültülmüş:

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

std kullanarak; kimse?

strager - başladığımda sadece bir çift vardı std :: 's ve' namespace std; ' bir sürü metindi. Şimdi daha az karakter olacağını düşünüyorum.

Sürümünüz benimkinden daha verimli değil, çünkü dizeler oluşturmak zorunda kalıyor, sürümüm sadece ihtiyaç duyduğu karakterleri basıyor. :)
pyon

6

Dil: piton, numara yok, 78 karakter

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

6

Harika 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) }

5

Answer cevabını geliştirmek. Yorum yapamam, bu yüzden işte yeni bir yazı. 72 karakter

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

"Python -c" oyununu kullanarak 61 karakter.

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

Merkez işlevini öğrendim ve "python -c" ifadesinin birden fazla satır kodu kabul edebileceğini öğrendim. Teşekkürler, ΤΖΩΤΖΙΟΥ.


5

Linq kullanarak C #:

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

5

AWK, bir satırda 86 karakter.

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

5

Dil: Java, Karakter sayısı: 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");}}

Başvuru için, önceki Java çözümünü traşlamayı başardım, önceki en az 269'dan 231 karaktere kadar, özyinelemeyi kullanarak T. Rasgele büyüklükte Törneklerden oluşan küçük bir orman oluşturabilirsiniz . İşte bu yapışmadaki son gelişmeler:

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

Yeni karakter sayınız 251 (1 ilgili alan)

"public static void main"
ifadesinden

Neredeyse 9 yıl geçtiğini biliyorum (lol ..) ama bazı şeyleri golf edebilirsiniz: 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 / bayt)
Kevin Cruijssen

5

Dil: PowerShell, Karakter sayısı: 41 (1 boşluk dahil)

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

5

Dyalog APL ile 21 karakter.

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

1 1 ile başlayan bir tamsayı vektörü verir.

1, ⍨ vektörün sonuna bir tane ekler. Bu ağacın ayağı olacak.

'*' \ ¨⍨, önceki vektör tarafından verilen uzunluklara sahip * -strings vektörünü verir.

Vector vektörü bir matrise dönüştürür ve sağa boşluk ekler.

m ← matrisi m olarak kaydeder.

0 1 zero sıfır satır ve ilk sütunu bırakır.

⌽ matrisi tersine çevirir.

m, ⍨ sağ tarafta m ile birleşir.


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

4

Dil: C, Char sayısı: 133

C versiyonunun iyileştirilmesi.

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

Çalışır ve hatta ağaç yüksekliğini argüman olarak alır. K & R tarzı kodunu tolere eden bir derleyici gerekir.

Şimdi çok kirli hissediyorum .. Bu kod çirkin.


Bu, Java'daki ilk bağlantımla aynı problemi yaratıyor; Komut satırı argümanı kullanan tam bir program değil!

Ah? Bu gerekli mi? Sorun değil. Bunu düzelteceğim.

Gereksiz tüm yeni satırlar kaldırıldığında 138 karakterdir.
Can Berk Güder


4

R (62 bayt)

Henüz R çözümü görmedim. Kaçırdıysam düzelt beni.

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

Çıktı:

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

3

Dil: C, Char sayısı: 176 (2 ilgili alan)

#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");}

3

Kabuk sürümü, 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" "*"


3

Dil: Python, Önemli karakter sayısı: 90

Çirkin ama işe yarıyor:

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

Karakter sayınız 98 (2 önemli boşluk, tırnak içinde olanlar)

3

Bu bir CW olduğu için: Golf kodlarının her zaman "karakter sayısı" veya somesuch şeklinde düzenlenmesini sevmiyorum. Derleyici / tercüman için talimat sayısı (veya benzer bir kriter) olarak düzenlenemez mi? İşte yine Ruby çözümü , ve temelde aynı, fakat şimdi de insan tüketimi için:

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

İlk ifadeye katılıyorum. Bu anlamda perl gibi dillerin başlangıç ​​avantajı vardır. Heykel sayısı veya benzeri bir şey olmalı.

teşekkürler ... dün golf hakkında bir soru sordum ve bunu yapmanın yolu "belirteçlerle" olabilir ... bu şekilde isim uzunluğu ve benzeri cezalandırılmaz.



2

PHP, 111 karakter

(Son karakter yeni bir satır olmalı.)

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

Okunabilir sürüm:

<?php

$n = $argv[1];

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

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

?>

Dizeyi oluşturarak, ardından onu ekleyerek birkaç karakter kaydedebilirsiniz. Bence. Bunu dene.

İyi fikir, ama denedim ve daha uzun sürecek. '$ t. = (...)', 'echo (...)' öğesinden yalnızca bir karakter daha kısadır ve sonunda sonunda '$ t' yazmanız gerekir.

'$ İ = 0;' harfini kaldırarak 4 karakter kısalttı for ifadesinin ilk kısmı. PHP, bir tamsayı bağlamında kullanılan var olmayan değişkenlerin zaten 0 olduğunu varsayar! : P

For içine $ r = .. koyarak bir char kaydedildi. Ayrıca, yeni satır karakterlerinin iki değil bir byte olması gerektiğini söylüyorum. =]

Evet, farkettim ki bir tanesini yanlış yazdım çünkü metin editörümdeki sütun numarasını kullandım. Linux kullandım, böylece yeni satır karakteri bir bayt.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.