크리스마스 트리 인쇄


26

도전

가장 짧은 코드를 사용하여 맨 위에 별표가있는 멋진 크리스마스 트리를 인쇄하십시오. 나무 별은 별표 ( *)이고 나무 몸통은 나무로 이루어져 0있습니다. 모든 행은 이전 행이 다음 행의 중심에 놓이는 방식으로 올바르게 들여 쓰기해야합니다. 주어진 행은 별인 첫 번째 행과 0이 하나만있는 두 번째 행을 제외하고 이전 행보다 2 개 더 많은 0을 가져야합니다. 결과는 다음과 같습니다.

          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

소프트웨어 변경없이 크기를 조정할 수있는 높이 트리를위한 타이 브레이크 (높이 매개 변수 변경 제외)

코드의 결과 트리도 붙여 넣으십시오!


리더 보드


3
정확히 복제본은 아니지만 SO에 코드가 있습니다
Hasturkun

답변:


17

골프 스크립트, 27 자

" "9*"*"9,{n\.4$>\.+)"0"*}%

결과 트리는 다음과 같습니다.

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

height 매개 변수를 한 번만 사용하는 버전은 한 문자 더 깁니다.

9." "*"*"@,{n\.4$>\.+)"0"*}%

stdin에서 높이를 읽으면 (예 : 트리를 생성하기 위해 "10"입력) 동일한 문자 수를 사용합니다 (28).

~,)" "*"*"@{n\.4$>\.+)"0"*}%

56

나는 이것이 사양을 준수하지 않는다는 것을 알고 있지만 Joan G. Stark 의이 고전적인 ASCII 아트 크리스마스 장면을 모방하여 여기 나무에 다양성을 추가하려고한다고 생각했습니다 .

나는 전체 그림을 재현하려고 시도하지 않았다 – 그것은 너무 많았을 것이다 – 그러나이 138 바이트 Perl 프로그램을 제시하는 나무 만 :

$_=join$/,qw'11| 8\2_2/ 9(\o/) 5---2/1\2--- 10>*<',map(11-$_.A.AA x$_,2..11),'9\|H|/';s/\d+/$"x$&/eg,s/A/substr">>>@*O<<<",rand 9,1/eg,say

물론 다음은 출력 샘플입니다.

           |
        \  _  /
         (\o/)
     ---  / \  ---
          >*<
         >O><@
        <><<>><
       @><><>@<<
      @<O><*@*>>O
     OO@@*O<<<*<OO
    ><<>@><<>@<><><
   >><O<>>><@*>>><<O
  *<>*<><<>@><O*>><*<
 O><><<@<*>><O*@>O><>*
O<><<><@O>>*O*OO<><<>O>
         \|H|/

온라인으로 사용해보십시오!

이 코드는 Perl 5.10+ say기능을 사용 하므로 -M5.010(또는 -E) 명령 행 스위치 로 실행해야합니다 . (실제로 say끝 부분을 바꾸면 print2 바이트가 더 필요하고 마지막 줄 출력 후 줄 바꿈이 손실되는 것을 피할 수 있습니다.)

트리의 대부분은 무작위로 생성되므로 장식품의 배치는 실행마다 다릅니다. 하지만 천사, 스탠드, 나무의 맨 윗줄은 고정되어 있습니다.


게시 된 이후에 설립 된 정책 에 따라이 대중적인 답변을 요약하여 삭제하지 못하도록하기 위해 토큰 사양 호환 솔루션 (45 바이트, Perl 5)도 있습니다.

$_=$"x10 ."*";say,s/ 0/00/,s/\*?$/0/ while/ /

온라인으로 사용해보십시오!

위의 프로그램과 마찬가지로이 기능도 -M5.010스위치를 사용하여 Perl 5.10+에서 실행해야 say합니다. 분명히 (이것은 문제입니다) 다른 모든 호환 항목과 동일한 지루한 출력을 생성하므로 여기서 반복하지 않아도됩니다. (숫자 10를 다른 값 으로 변경하여 크기를 조정할 수도 있습니다 .)


1
큰! 스펙이 아니라 심사 위원 특별상이 당신을위한 것이라고 생각합니다! :)
Averroes

6
이것은 스펙의 속담을 걷어차 고, 가능하다면 +2를 발산합니다.
Kris

3
죄송하지만 규칙에 따라 사양을 충족하지 않는 답변은 삭제해야합니다.
mbomb007


1
유효한 답변을 맨 위로 이동하고 헤더를 추가해 주시겠습니까?
데니스

13

GolfScript (33 자)

고정 높이 버전 :

;8:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

또는 정확히 같은 길이

;8:^' '*.'*'+n@'0'+^{.n\(;'00'+}*

나무는 다른 모든 사람들과 매우 비슷하게 보입니다.

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

stdin에서 높이를 취하는 버전 :

~((:^' '*.'*'+\'0'+^{.(;'00'+}*]n*

이전 줄의 시작은 "유용한"GolfScript 프로그램에서 만든 더 좋은 웃음 중 하나입니다.


10

쉘 스크립트, 44 자

printf %9c\\n \* 0|sed ':x
p;s/ 0/000/;tx
d'

이 트리를 인쇄합니다.

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

9

메이플, 30/37 자

Mr.Wizard의 Mathematica 항목 에서 영감을 얻은 이 30 자 메이플 12 명령은 다음과 같습니다.

<`*`,('cat(0$2*i+1)'$i=0..8)>;

산출:

                              [        *        ]
                              [                 ]
                              [        0        ]
                              [                 ]
                              [       000       ]
                              [                 ]
                              [      00000      ]
                              [                 ]
                              [     0000000     ]
                              [                 ]
                              [    000000000    ]
                              [                 ]
                              [   00000000000   ]
                              [                 ]
                              [  0000000000000  ]
                              [                 ]
                              [ 000000000000000 ]
                              [                 ]
                              [00000000000000000]

또한 7 문자를 더 사용하여 대괄호를 제거 할 수 있습니다.

`*`;for i in$0..8 do;cat(0$2*i+1);od;

생략 된 출력 — 괄호없이 만 위와 같습니다. 불행히도, 나는 텍스트 모드에서 메이플이 출력 행 사이에 빈 줄을 삽입하지 못하게하는 방법을 모른다. 클래식 워크 시트 모드에서는 더 좋아 보입니다. 스크린 샷을 포함시킬 수있을 것 같습니다 ...

스크린 샷

(스크린 샷은 이전 44 문자 버전의 명령을 보여 주지만 너무 지연되어 다시 사용할 수 없습니다. 출력은 여전히 ​​동일합니다.)

아, 그렇습니다. 크기는 완전히 조정 가능합니다. n 행 트리의 경우 8을 n -2로 바꾸십시오 . 첫 번째 솔루션을 사용하면 25 행 이상 (또는 GUI에서 10 행)을 초과하면 interface (rtablesize = n ) 도 설정해야합니다 .

(시. 내가 관리했던 생각 GolfScript를 이길 최신 버전으로, 그러나 슬프 도다 ... )


8

펄, 42 자

say$"x9,"*";say$"x(9-$_),"00"x$_,0for 0..8

산출:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000

8끝에있는 값을에서 -1로 대체하여 트리의 높이를 1 ~ 11 행으로 변경할 수 있습니다 9. 11 행을 넘어가 9려면 코드의 앞부분에서 2 초를 늘려야합니다 . 코드는 화면 왼쪽에서 트리가 들여 쓰기되는 정도를 제어합니다.


이 사람은 11 개 행이 : P 마이너 내가 추측 변경
아베로에스

@ Averroes : 예, 처음에 10 행 별을 더한 것으로 가정 했지만 실제로 샘플 출력의 행을 세어 수정했습니다.
Ilmari Karonen

8

그루비, 65

(p={c,r->println' '*(9-r)+(c*(r*2-1))})'*',1;(1..9).each{p'0',it}

놀랍게도 나무는 다음과 같습니다.

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

'트리 출력을 게시'부분은이 사이트에 몇 가지 크리스마스 정신을 가져위한 것입니다 : P
아베로에스

또한 11 줄도 있습니다!
Averroes

높이 매개 변수를 조정하여 문제를 해결할 수 있습니다!
Armand

8

루비, 46 자

puts" "*8+?*;9.times{|i|puts"%8s0"%(v=?0*i)+v}

높이를 변경하려면 8과 9도 변경해야합니다. 프로그램의 출력은 다음과 같습니다.

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

편집 : 나는 필연적으로 첫 번째 제출에서 출력을 생략했습니다.


1
출력을 게시하지 않았습니다. :)
Ilmari Karonen

7

PowerShell, 41

" "*8+"*";0..8|%{" "*(8-$_)+"0"+"0"*$_*2}

의외로, 다른 사람과 같은 나무를 출력합니다 :-p

8을 매개 변수화하면 콘솔의 최대 크기 (예 : 48 자)를 얻을 수 있습니다 .

" "*($w=8)+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

또는 53자인 인수를 취하는 완전한 스크립트로 사용됩니다 .

param($w)" "*$w+"*";0..$w|%{" "*($w-$_)+"0"+"0"*$_*2}

다음과 같이 보입니다.

PS>: Get-Tree.ps1 8
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

7

파이썬 3:62 자

print(' '*9+'*',*('\n'+' '*(9-i)+'0'*(i*2+1)for i in range(9)))

산출:

        * 
        0 
       000 
      00000 
     0000000 
    000000000 
   00000000000 
  0000000000000 
 000000000000000
00000000000000000

이것은 파이썬 3으로 변환 할 때 73 문자를 사용하기 때문에 본질적으로 @Ante의 대답보다 11 문자를 능가합니다.

9다른 높이에 대해 각각 다른 값으로 변경하십시오 .


3
당신도 전에 공간을 잃을 수 있다고 생각합니다 for.
badp December

@badp 감사합니다 —63에서 62로 변경되었습니다!
Kazark

6

파이썬, 59

print' '*9+'*'
for i in range(9):print' '*(9-i)+'0'*(i*2+1)

훌륭합니다. 이것은 @Ante의 답변이 Python 3에서 더 길어 지지만 Python 3의 답변은 Python 2에서 더 짧습니다 ( print함수가 아님).
Kazark

6

프롤로그 : 183 또는 186

r(0,_,L,L).
r(N,C,L,[C|T]):-N>0,M is N-1,r(M,C,L,T).
y(S,T,C):-r(T,C,[10],X),r(S,32,X,Y),atom_codes(A,Y),write(A).
x(A,B):-A>0,y(A,B,48),C is A-1,D is B+2,x(C,D).
x(N):-y(N,1,42),x(N,1).

인쇄물:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
false.

특정 통역사를 위해 더 압박 할 수 있음 (예 : SWI에서 tab / 1 사용)

x (N)으로 호출하십시오. 여기서 N은 실제 트리의 행 수입니다 (별표 제외). 높이를 고정하면 183로 줄어 듭니다.


6

기음

이것은 Wade Tandy의 C 버전이지만 약간 수정되었습니다.

           ;
          int
         main(
        ){int i
       =-1,j=0,c
      =10;while(j
     ++<c){printf(
    " ");}{;printf(
   "*");}while(++i<c
  ){for(j=-2;++j<c-i;
 )printf(" ");for(j=0;
++j<2*i;){printf("0");}
          ;;;
        printf(
         "\n")
          ;}}


5

Applesoft BASIC, 143 자

이 질문은 내가 고등학교에 다니던 숙제를 생각 나게하기 때문에 (애플에서 // e를 가르 칠 때) :

1INPUTH:X=(H*2)-2:C=(X/2):S$="*":O=0:GOSUB2:S$="0":FORO=0TOX-2STEP2:GOSUB2:NEXT:END
2FORS=0TOC-(O/2):?" ";:NEXT:FORI=0TOO:?S$;:NEXT:?"":RETURN

여기에있는 JavaScript Applesoft BASIC을 사용했습니다 : http://www.calormen.com/applesoft/

산출:

?10
          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

5

프롤로그 : 127 자

p:-write('        *'),h(1).
h(L):-(L<10,nl,w(L,-8),h(L+1));!.
w(L,N):-(N<9,N<L,(L>abs(N)->write('0');write(' ')),w(L,N+1));!.

산출:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
true 

그의 코드를 보지 않고 레코드 Prolog를 이길 수 없었기 때문에 사용 되었습니다 Groovy:(.


5

PostScript (매개 변수가있는 높이), 114 자

/h 9 def/b{{( )=print}repeat}def
h -1 0{dup h eq{dup b(*)=}if dup b h sub neg 2 mul 1 add{(0)=print}repeat()=}for

산출:

         *
         0
        000
       00000
      0000000
     000000000
    00000000000
   0000000000000
  000000000000000
 00000000000000000
0000000000000000000

뭐, 인쇄하고 싶었어?


4

JavaScript (Rhino : 108, Node : 114, Webkit Dev Console : 119, jQuery 플러그인 : 132)


Rhino 는 (a) print함수의 이름이 짧고 (b) 내장 함수를 더 짧은 변수 이름에 할당 할 수 있기 때문에 가장 짧은 (108 자) 입니다. 그래서:

h=10,p=print,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


Node.js 는 인쇄 기능의 console.log이름이 더 길기 때문에 114 자에 가깝지만 짧은 변수에도 할당 할 수 있습니다.

h=10,p=console.log,m='0',a=Array(h-1),s=a.join(' ');p(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();p(a.join(' ')+m);}


그러나 Webkit Dev Console (그리고 아마도 Firebug도) p=console.log은 조금 교묘 하다고 생각 합니다 (호출하려고하면 p()불평 할 것입니다). 따라서 우리는 119 자로 길이를 늘려야합니다.

h=10,m='0',a=Array(h-1),s=a.join(' ');with(console){log(s+'*\n'+s+m);while(h-->2){m+='00';a.pop();log(a.join(' ')+m);}}

(재미있게, with우리에게 캐릭터를 구할뿐입니다).


마지막으로 ... jQuery 플러그인 (여전히 132 자로 트위 블 가능!) :

$.fn.xms=function(h){var m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$(this).css({textAlign:'center'}).html(l.join('\n<br/>'));}

그리고 당신은이 페이지의 바닥 글에서 그것을 호출 할 수 있습니다 : $('#footer').xms(3)

물론 플러그인 일 필요는 없습니다. JavaScript 콘솔을 사용하여 페이지에 추가하고 호출해야하기 때문에 jQuery 스 니펫을 수행했을 수 있습니다 .

h=10,m='0',w=2,l=['*',m];while(w++<h)l.push(m+='00');$('#footer').css({textAlign:'center'}).html(l.join('\n<br/>'));

경쟁이 치열한 116 자이며 실제로 다른 개발자 콘솔 구현보다 뛰어납니다. 그러나 jQuery 및 / 또는 브라우저의 레이아웃 엔진을 사용하는 것은 속임수로 간주 될 수 있습니다. :)


4

C, 67

나는 이것이 끝났다는 것을 알고 있지만 이것이 코드 골프에 대한 첫 번째 시도이며, 나는 꽤 멋진 C 솔루션을 가지고 있다고 생각합니다.

흥미롭게도 @Patrick의 매우 유사한 솔루션과 독립적으로 이것을 생각해 냈습니다.

그리고 네, 하드 코딩 된 값으로 어떤 관계도 얻지 못합니다.) 어쨌든 매우 기쁩니다.

i;main(){for(;i<10;++i)printf("%*s%0*c\n",i?9-i:8,"",i*2,i?32:42);}
        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000
계속하려면 아무 키나 누르십시오. . .

4

신탁

select lpad('*', 11) from dual
union all
select rpad(' ', 10 - level) || rpad(' ', level * 2, '0') from dual
connect by level <= 9;


          *
          0
         000
        00000
       0000000
      000000000
     00000000000
    0000000000000
   000000000000000
  00000000000000000

10 rows selected.


4

LOLCODE, 527 바이트

CAN HAS STDIO?
HAI 1.2
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 8
    VISIBLE " "!
IM OUTTA YR LOOP
VISIBLE "*"
I HAS A SPACES
SPACES R 8
I HAS A ZEROS
ZEROS R 1
IM IN YR LOOP UPPIN YR VAR TIL BOTH SAEM VAR AN 9
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN SPACES
        VISIBLE " "!
    IM OUTTA YR LOOP
    IM IN YR LOOP UPPIN YR VAR2 TIL BOTH SAEM VAR2 AN ZEROS 
        VISIBLE "0"!
    IM OUTTA YR LOOP
    VISIBLE ""
    SPACES R DIFF OF SPACES AN 1
    ZEROS R SUM OF ZEROS AN 2
IM OUTTA YR LOOP
KTHXBYE

온라인으로 사용해보십시오!

산출:

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

1
이것은 code-golf 이므로 제출의 바이트 수를 헤더에 추가하십시오.
lirtosiast

4

파이썬, 70 자

너무 짧지는 않지만 재귀 솔루션 :-)

def a(s):
 print s
 if s<"0":a(s[1:]+"00")
print" "*8+"*"
a(" "*8+"0")

높이를 설정하려면 8을 변경하십시오.


4

자바 스크립트, 119 자

파이어 버그 콘솔로 출력

i=h=9;a=new Array(h);a[0]=a.join(' ');b=a.join('000');a[0]+='*';while(i)a[i--]=b.substr(i,h+i);console.log(a.join('\n'))


        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

2
실제로 120 자입니다.
Rob Fox

3

PHP 113

PHP 버전으로 차임 할 것이라고 생각했습니다.

113 자 ( $h높이를 변경하도록 조정 하고 줄 수에는 별이 포함됨) :

$h=10;for($n=0;$n<$h;$n++){$i=$n>0?$n:1;$c=$n<1?"*":"0";echo str_repeat(" ",$h-$i).str_repeat($c,($i*2)-1)."\n";}

나는 그것을 읽을 수없는 짧게 만들려고 노력했으며 우리는 이미 PHP가 간결함을 놓고 경쟁 할 수 없다는 것을 알고 있었기 때문에 이것은 여전히 ​​재미있는 작은 퍼즐입니다.

출력은 사양과 같습니다.

        *
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

조금 더 작은 문자, 103 문자를 하드 코딩 (이 주석 내 첫 에코에 공백을 볼 수 없음) $ n = 0; echo "* \ n"; for ($ i = 9; $ i> 0; $ i-, print str_repeat ( '', $ i) .str_repeat ( '0', $ n + 9- $ i). "\ n", $ n ++);
Lucia

나무의 높이를 변경하면 하드 코딩 된 첫 번째 줄이 균형을 벗어날 것입니다 :-(
Kris

3

C, 77

i;main(c){printf("%*c\n",c,42);while(i<c)printf("%*s%0*d\n",c-i,"",i++*2+1,0);}

printf 사양을 더 신중하게 읽기 전에이 귀여운 숫자는 138 자였습니다.

#define x sprintf(b,
#define y printf(b,
i;main(c){char b[9]="%%%dc\n",*t="%%%ds%%0%dd\n";x b,c);y 42);while(i<c)x t,c-i,i++*2+1),y "",0);}

3

자바, 192 (198 매개 변수 포함)

class V{public static void main(String[]a){int c=10,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

요청 된 트리를 인쇄합니다.

        *           
        0
       000
      00000
     0000000
    000000000
   00000000000
  0000000000000
 000000000000000
00000000000000000

가변 높이의 경우 약간 길어집니다.

class W{public static void main(String[]a){int c=a.length,i=-1,j=0;String s="";while(j++<c)s+=" ";s+="*";while(++i<c){for(j=-2;++j<c-i;)s+=" ";for(j=0;++j<2*i;)s+="0";System.out.println(s);s="";}}}

명령 행 인수 목록의 길이는 높이를 결정합니다 (예 : java W a a a a a높이 5).

(이것은 기본적으로 Wade Tandy의 C 솔루션의 Java 버전입니다.)


나는 :)이 얼마 전에 게시 알고 있지만, 여기 내가 보는 두 가지가 있습니다 : 1. 당신은 자바 8 클래스 대신 인터페이스를 사용할 수있는 두 개의 문자를 저장 2. while (++i < c) {-> for (s += "*";++i < c;s = "") {및 제거 s += "*";와를s = "";
Reinis을 Mazeiks

3

Vim, 18 바이트

17i0<esc>qqYPxr q8@qa*

이전 버전과 호환되는 V 인터프리터에서 온라인으로 사용해보십시오 !

이것은 내 V 답변과 매우 비슷한 접근 방식이지만 vim이 오래 되어서 경쟁 이 아닙니다 . :)

설명:

17i0<esc>               " Insert 17 '0's
         qq     q       " Start recording into register 'q'
           YP           " Duplicate this line upwards
             x          " Delete one character
              r         " Replace this character with a space
                 8@q    " Playback macro 'q' 8 times
                    a*  " Append an asterisk

3

스칼라, 74 바이트

val h=10;println(" "*h+"*");for(i<-0 to h-2)println(" "*(h-i)+"0"*(i*2+1))

h -나무의 높이

산출

        *          
        0          
       000         
      00000        
     0000000       
    000000000      
   00000000000     
  0000000000000    
 000000000000000   
00000000000000000  

2

C, 80

i=9,k=10,j;main(F){while(i)putchar(++j<i?32:j<k?48-F*6:(i-=!F,k+=!F,F=j=0,10));}

k를 트리 높이로 초기화하고 i를 k-1로 초기화합니다. F는 첫 번째 라인 플래그입니다. 인수가 없으면 F는 1이되어야합니다.

f가 첫 번째 라인 플래그가 아닌 약간 더 긴 (81) 버전 :

i=9,k=10,j,f;main(){while(i)putchar(++j<i?32:j<k?42+f*6:(i-=f,k+=f,f=1,j=0,10));}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.