거의 크리스마스입니다!


14

이 때문에 전 세계의 가족들이 크리스마스 트리를 만들고 있습니다.

그러나이 정상적인 트리는 잠시 후에 지루해질 수 있으므로 ASCII 트리를 만들어 봅시다!

리프는 #예제 출력에 표시된대로 표시되며 배열되어야합니다. 우리는 나무 주위에 무작위로 배치하는 O5 개의 공 ( )과 5 개의 사탕 지팡이 ( J)를 가지고 있습니다. 우리는 또한 위에 촛불이 있습니다.

입력 : 없음

산출:

         ^
         |
        ###
       ##O##
      #######
       #####
      ####J##
     #########
    ####O######
   #############
      ###J###
     #########
    ####O###J##
   #######O#####
  ###J########O##
 ###########J#####
        ###
        ###

규칙 (규칙에없는 경우 가능하다고 가정)

  • 공과 사탕 수수는 나무에 무작위로 놓아야하며 대각선을 세지 않고 그 사이에 적어도 하나의 잎이 있어야합니다.

  • 각 잎은 공이나 사탕 수수를 얻을 확률이 0이 아니어야합니다.

  • 나무가 적절한 모양을 유지하는 한, 각 줄에 앞뒤 공백이있을 수 있습니다.

  • 이것은 이므로 문자가 가장 짧은 코드가 승리합니다.


2
@Billywob 그것은 가까운 하나입니다, 이것은 임의의 요인과 촛불 tho가 있습니다 : P
Gray

1
예, 이것은 가장 어려운 imo입니다.
Billywob

3
"그러나이 보통 나무는 잠시 후에 지루해질 수 있습니다." 그렇다면 왜 구식 양초가 아닌 독창적 인 것 입니까?
manatwork

1
아무도 언급하지 않았으므로, 앞으로 도전 과제를 Sandbox 에 게시하여 중요한 피드백을 받고 도전 과제를 Main에 게시하기 전에 조정할 수있는 것이 좋습니다 .
AdmBorkBork

1
당신 같은 표정에 응답하지 않는 경우 나는 바이트가 아닌 문자로 득점을 제안한다.
Dennis

답변:


4

자바 스크립트 (ES6), 148 바이트

바라건대, 이것은 '무작위'조건을 준수해야합니다.

_=>[...'887656543254321077'].map(n=>' '.repeat(n)+'#'.repeat(17-2*n)).join`
`.replace(/#/g,_=>'OJ^|#'[++i<4?i:i>133|++j%13?4:j/13&1],i=1,j=new Date)

데모


나는 테스트를했고 나무가
부러졌으며

@ user2216 내가 어떻게 든 무언가를 놓치거나 오해하지 않는 한, 모듈로는 대각선을 제외하고는 일어날 수없는 방식으로 선택되었습니다. (13 개 별개의 패턴은 대체하여 테스트 할 수 있습니다 j=new Datej=0j=12.)
Arnauld

8

CS- 스크립트-306 바이트

var c=new string(' ',342).ToCharArray();var r=new Random();int e=18,i,j,w;for(;i<e;i++){c[i*e+e]='\n';w=i<5?i:i<10?i-2:i<16?i-6:2;for(j=1;j++<w*2;)c[i*e+8-w+j]='#';}for(i=0;i<10;){j=37+r.Next(288);if(c[j]=='#'&c[j+1]<42&c[j-1]<42&c[j+e]<42&c[j-e]<42)c[j]=i++<5?'J':'O';}c[8]='^';c[27]='|';Console.Write(c);

서식과 설명으로 다시 한 번 :

// create 'char bitmap' filled with spaces
var c=new string(' ',342).ToCharArray(); 
// Random for placing ornaments
var r=new Random();
int e=18,i,j,w;
// once for each row
for(;i<e;i++)
{
    // add new lines
    c[i*e+e]='\n';
    // determine width of tree for this row
    w=i<5?i:i<10?i-2:i<16?i-6:2;
    for(j=1;j++<w*2;)
        // add leaves
        c[i*e+8-w+j]='#';
}
for(i=0;i<10;)
{
    // select random location
    j=37+r.Next(288); 
    if( // check we have a leaf
        c[j]=='#' &
        // check surrounding to be leaf/space/new-line
        c[j+1]<42 & c[j-1]<42 & c[j+e]<42 & c[j-e]<42)
        // add ornament if location is valid
        c[j]=i++<5?'J':'O';
}
// light candle
c[8]='^';
c[27]='|';
// print
Console.Write(c);

기본적으로 C #이지만 CS-Script를 사용하면 모든 보일러 플레이트를 건너 뛸 수 있습니다.

여기 사용해보십시오!

노트:

현재 트리 아래에 공백 줄을 하나 더 출력하여 '아래의 기존 장식품 확인'에서 IndexOutOfBoundsException이 발생하지 않도록합니다. 다른 해결책은 다음과 같습니다.

  • 아래를 확인하기 전에 마지막 줄인지 확인하십시오 (문자를 몇 개 더 추가하십시오)
  • 트리의 '줄기'에 장식품을 추가하지 않음 (같은 바이트 수이지만 규칙에 위배되는 것으로 보입니다)

변경해야한다면 OP로 남겨 두겠습니다.

마지막으로 이것은 내 첫 골프이므로 모든 의견을 부탁드립니다. ;)


좋은 해결책. 그것은 당신이 포함 할 필요가 있다고 생각 using System;사용할 수 없기 때문에, 비록 당신의 바이트 수에 Random또는 Console없이. meta.codegolf.stackexchange.com/questions/10081/… 13 바이트를 추가하지
못했습니다

@Erresen : 링크 주셔서 감사합니다! 내가 알 수있는 한, 그것은 실행에 필요한 가져 오기에 대해서만 이야기하고 cs-script using System;는 필요하지 않습니다 (공통 네임 스페이스를 자동으로 가져옵니다). 그러나 어쩌면 나는 머리카락을 나누고있을 것입니다. ¯_ (ツ) _ / ¯
amulware

누가 알아! 나는 다른 날 자신을 연주하기 시작했다. 답변을보기 전에 cs 스크립트에 대해 몰랐습니다. 골프에서 일부 C # 단점을 피하는 데 정말 유용합니다. 대답이 무엇이든간에 AC # 스크립트가 곧 이길 것이라고 생각하지 않습니다.
Erresen

그 정도는 확실합니다 : D
amulware

함수로 컴파일하면 가능하면 CS-Script에서 바이트 수를 줄일 수 있습니다._=>{var c=... return c;}
TheLethalCoder

4

TSQL, 556 (532) 494 476 바이트

이 스크립트는 마스터 데이터베이스에서 실행해야합니다

골프 :

DECLARE @ varchar(max)='',@h INT=0,@w INT=0WHILE @h<18SELECT
@+=space(9-@w)+REPLICATE(char(IIF(@h<2,94+30*@h,35)),@w*2+1)+space(9-@w)+CHAR(10),@h+=1,@w+=CHOOSE(@h,0,1,1,1,-1,1,1,1,1,-2,1,1,1,1,1,-8,0)WHILE
@h>7WITH C as(SELECT*,substring(@,number,1)v,number/20r,number%20c
FROM spt_values WHERE type='P'and number<358)SELECT @=stuff(@,number,1,CHAR(74+@h%2*5)),@h-=1FROM
c d WHERE v='#'and not exists(SELECT*FROM c WHERE abs(d.c-c)+abs(d.r-r)<2and'A'<v)ORDER BY newid()PRINT @

언 골프 드 :

DECLARE @ varchar(max)='',@h INT=0,@w INT=0

WHILE @h<18
  SELECT @+=
    space(9-@w)+REPLICATE(char(IIF(@h<2,94+30*@h,35)),@w*2+1)
      +space(9-@w)+CHAR(10),
    @h+=1,
    @w+=CHOOSE(@h,0,1,1,1,-1,1,1,1,1,-2,1,1,1,1,1,-8,0)

WHILE @h>7
  WITH C as
  (
    SELECT*,substring(@,number,1)v,number/20r,number%20c
    FROM spt_values
    WHERE type='P'and number<358
  )
  SELECT @=stuff(@,number,1,CHAR(74+@h%2*5)),@h-=1
  FROM c d
  WHERE v='#'and not exists(SELECT*FROM c WHERE abs(d.c-c)+abs(d.r-r)<2and'A'<v)
  ORDER BY newid()

PRINT @

사용해보십시오


1

파이썬 3 - (450) 427 바이트

나는 450파이썬에 너무 많다는 것을 안다 . 하지만 .....

from random import randint as r
t=lambda o,g:(o*g).center(19,' ')+';';s,z='','#';s+=t(z,3)*2
for h,w in zip([6,5,3],[17,13,7]):
 for i in range(h):s+=t(z,w);w-=2
s+=t('|',1)+t('^',1);s=[list(i)for i in s.split(';')]
for o in'O'*5+'J'*5:
 while 1:
  h,w=r(2,15),r(1,16)
  m=s[h]
  C,m[w]=m[w],o
  P=s[h-1][w]+s[h+1][w]+m[w-1]+m[w+1]
  if not('O'in P or'J'in P)and C!=' ':break
  m[w]=C
print (*[''.join(i)+'\n'for i in s][::-1])

(가) 경우 for i in'O'*...로 설정되어 더 나은 재귀 함수 바이트의 다음 많이 줄일 수 있습니다.

여기 사용해보십시오

편집 :

;구분 기호 로 사용하여 2 바이트를 저장 하고 개행 바이트 수를 1 바이트로 사용하여 몇 바이트를 저장했습니다.


1

자바 스크립트, 204 바이트

f=(s='^|1232345634567811'.replace(/./g,x=>(y=x|0,' '.repeat(8-y)+(y?'#'.repeat(y*2+1):x)+`
`)),o=5,j=5,r=(Math.random()*56|0)*4,k)=>j?f(s.replace(/###/g,(_,i)=>i-r?_:k=o?'#O#':'#J#'),k?o-!!o:o,k?j-!o:j):s

console.log(f());
.as-console-wrapper{max-height:100%!important;top:0}


1
\n1 바이트로 계산 합니까?
Daniel Shillcock

더 이상은, 죄송합니다
Washington Guedes

1

PHP, 200 바이트

보다 정교한 접근 방식으로 더 짧을 수 있습니다. 하지만 서두르고 있습니다.

for(;$c="^|2343456745678922"[$i++];)$s.=str_pad(+$c?str_pad("",2*$c-1,"#"):$c,17," ",2)."
";for(;$n++<10;)$s[$p=rand(0,288)]!="#"|($s[$p-18]|$s[$p+18]|$s[$p-1]|$s[$p+1])>A?$n--:$s[$p]=OJ[$n&1];echo$s;

PHP 5.6 또는 7.0이 필요합니다. 온라인으로 실행 -nr하거나 사용해보십시오 .


0

스칼라, 329 바이트

var r=scala.util.Random;var z=r.nextInt(2);def t{print(new StringBuilder({"^|234345645678922".map(x=>{val t=if(x>57)8 else(57-x);" "*t+{if(x>57)""+x else "#"}*(17-(t*2))+" "*t+" \n"})}.mkString)match{case e=>{var w=0;while(w<10){{val b=(r.nextInt(e.size/2)*2)+z;if(e.charAt(b)=='#'){e.setCharAt(b,if(w<5)'O'else'J');w+=1}}};e}})}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.