거꾸로 크리스마스 트리를 만들어주세요!


15

도전

우리는 모두 정상적인 크리스마스 트리에 대해 알고 있지만 거꾸로 된 크리스마스 트리는 어떻 습니까 ! 이것은 매우 쉬운 크리스마스 테마 도전입니다. 이 과제의 목표는 ASCII 거꾸로 크리스마스 트리를 만드는 것입니다. 이 도전에 대한 규칙은 다음과 같습니다.

  1. 홀수, 양의 정수를 허용하십시오. 당신은 항상 사이가 될 것입니다 가정 할 수 751.
  2. 나무의 밑면은 문자로 구성됩니다.

    ___
    \ /
     |
    
  3. 나무의 꼭대기 (별)는 하나의로 구성 *됩니다.

  4. 트리의 각 라인은 형식을 사용하여 구성됩니다 임의의 수입니다 들. 예를 들어 length 줄을 만드는 경우 줄은 이어야합니다 . 또는 줄을 길게 만들면 줄이되어야합니다 .<?>?-5<--->8<------>

  5. 다음은 나무의 몸체를 구성하는 방법입니다.

    1. n입력으로 주어진 홀수를 취하고 그 길이의 트리를 만듭니다.

    2. 빼기 4에서 n그 길이 나무의 라인을 만들 수 있습니다.

    3. 빼기 2에서 n그 길이 나무의 라인을 만들 수 있습니다.

    4. 감소 n에 의해 2. 그런 다음 n같지5 않으면 2 단계로 돌아가십시오.

  6. 기본 (2 단계 참조) 별 (3 단계 참조)과 트리의 각 줄 (4 단계 및 5 단계 참조)은 모두 원래 홀수 입력 (1 단계 참조)을 최대로 사용하여 중앙에 있어야합니다 . 폭.

예제 / 테스트 사례

odd number inputed: 7
  ___
  \ /
   |
<----->      line length -> 7
  <->        line length -> 7 - 4 = 3
 <--->       line length -> 7 - 2 = 5
   *


odd number inputed: 13
     ___
     \ /
      |
<----------->      line length -> 13
  <------->        line length -> 13 - 4 = 9
 <--------->       line length -> 13 - 2 = 11
   <----->         line length -> 11 - 4 = 7
  <------->        line length -> 11 - 2 = 9
    <--->          line length -> 9 - 4 = 5
   <----->         line length -> 9 - 2 = 7
     <->           line length -> 7 - 4 = 3 
    <--->          line length -> 7 - 2 = 5
      *


odd number inputed: 9
   ___
   \ /
    |
<------->      line length -> 9
  <--->        line length -> 9 - 4 = 5
 <----->       line length -> 9 - 2 = 7
   <->         line length -> 7 - 4 = 3
  <--->        line length -> 7 - 2 = 5
    *


odd number inputed: 17
       ___
       \ /
        |
<--------------->      line length -> 17
  <----------->        line length -> 17 - 4 = 13
 <------------->       line length -> 17 - 2 = 15
   <--------->         line length -> 15 - 4 = 11
  <----------->        line length -> 15 - 2 = 13
    <------->          line length -> 13 - 4 = 9
   <--------->         line length -> 13 - 2 = 11
     <----->           line length -> 11 - 4 = 7
    <------->          line length -> 11 - 2 = 9
      <--->            line length -> 9 - 4 = 5
     <----->           line length -> 9 - 2 = 7
       <->             line length -> 7 - 4 = 3
      <--->            line length -> 7 - 2 = 5
        *    

규칙


3
입력 값이 홀수 인 것을 알면 홀수의 순서로 인덱스를 취할 수 있습니까?
FlipTack

또한 - repeat the above steps until the odd number minus 2 equals 5- 첫 번째 입력에, 홀수 따라서 나무가 즉시 종료한다, 7, = 5 (7-2)입니다 (난 당신이 무슨 뜻인지,하지만 문구를 수정 필요가)
FlipTack

@FlipTack 무슨 말인지 정확히 모르겠습니다. 홀수가 7최소 입력 인 경우 먼저 세 개의 트리 라인 (하위 단계 .1.1, .1.2, .1.3)을 만든 다음2 홀수에서 빼고 같은지 테스트합니다 5. "홀수-빼기 2가 5와 같은지"확인하기위한 명령이 마지막에 있으면 다른 세 단계를 먼저 수행해야합니다. 그러나 첫 번째 의견에 대답하면 괜찮을 것입니다.
Christian Dean

1
@FlipTack 그는 네 번째 홀수 (또는 0 인덱스) 7와 같이 입력 으로 수락 해야하는지 또는 수락 할 수 있는지 묻고 있다고 생각합니다 . 43
DonielF

4
제목 : "좋아, 이제 거꾸로 크리스마스 트리가되었습니다."
dkudriavtsev

답변:


10

파이썬 (3) , 127 (121) 105 (103) 100 98 바이트

이것은 행 목록을 반환하는 명명되지 않은 람다 함수입니다.

lambda o:[s.center(o)for s in['___','\ /','|',*[f'<{"-"*(o-i+2-i%2*3)}>'for i in range(4,o)],'*']]

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

이 답변의 주요 부분은입니다. 이것은 (o-i+2-i%2*3)줄에 가질 대시 수를 계산합니다. 나머지 대답은 단순히 이것을 원하는 ASCII 아트로 변환하는 것입니다.

6 바이트를 면도하고 채팅으로 나와 골프 에 대해 이야기 해 주신 Xcoder 씨에게 감사드립니다 .

Lynn 이 2 바이트 더 짧을 3*(i%2)수 있다는 사실에 감사드립니다 i%2*3!



2
파이썬 답변을 게시 할 때마다 @ Mr.Xcoder는 시간이나 현재 위치에 관계없이 제공 할 골프가 있습니다.
FlipTack

Welp , 이것은 250 바이트 이상의 Python 솔루션을 쉽게 능가합니다. 좋은 작업! +1
Christian Dean

o-i+2-i%2*32 바이트를 절약합니다.
Lynn

@ 린 좋은 자리, 업데이트되었습니다.
FlipTack

7

C, 163 바이트

#define P;printf(
i;g(l){P"%*c",1+i-l--/2,60);for(;--l P"-"))P">\n");}f(n){i=n/2 P"%*c__\n%*c /\n%*c|\n",i,95,i,92,i,32);for(g(n);n>5;g(n-=2))g(n-4)P" %*c",i,42);}

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

풀림 :

#define P;printf(

i;
g(l)
{
    P"%*c", 1+i-l--/2, 60);
    for (; --l P"-"))
    P">\n");
}

f(n)
{
    i=n/2
    P"%*c__\n%*c /\n%*c|\n", i, 95, i, 92, i, 32);

    for(g(n); n>5; g(n-=2))
        g(n-4)

    P" %*c", i, 42);
}


5

, 28 바이트

__⸿ /⸿|F⮌…¹⊘N«⸿⊕ι>⸿⊖ι>»‖B← *

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

__⸿ /⸿|

받침대를 인쇄하십시오.

F⮌…¹⊘N«

입력 번호의 절반에서 1까지 반복합니다.

⸿⊕ι>⸿⊖ι>»

첫 번째 -는 루프 인덱스보다 하나 더 많고 두 번째는 더 적은 줄로 인쇄 합니다.

‖B←

나무를 완성하기 위해 거울.

 *

별을 배치하십시오.



3

망막 , 89 바이트

.+
$*->
^--
<
+`( *<)----(-+>)$
$&¶  $1$2¶ $1--$2
s`.*¶( +)<->.*
$1___¶$1\ /¶$1 |¶$&¶$1 *

온라인으로 사용해보십시오! 설명 : 첫 번째 단계는 입력을 단항으로 변환하고를 추가합니다 >. 두 번째 단계는 라인 길이를 수정하기 위해 두 개의 -s를 a <로 바꿉니다 . 그런 다음 세 번째 단계는 분기를 복제하지만 분기를 더 이상 단축 할 수 없을 때까지 매번 약간 짧아집니다. 마지막 단계는 기본과 별을 추가합니다.


2

자바 스크립트 506 바이트

골프 버전 :

function tree(i){const mid=(i+1)/2;const leg1=' '.repeat((mid-2))+`___
`;const leg2=' '.repeat((mid-2))+`\\ \/
`;const leg3=' '.repeat((mid-1))+`|
`;let xmasTree=leg1+leg2+leg3;for(let j=0;j<(i-4);j++){if(j%2===0){let v=j/2;let t=i-2*v-2;let body1=" ".repeat(j/2)+"<"+"-".repeat(t)+">"+`
`;xmasTree=xmasTree+body1}else{let k=1+Math.ceil(j/2);let h=i-2*k-2;let body2=' '.repeat(k)+'<'+'-'.repeat(h)+">"+`
`;xmasTree=xmasTree+body2}}
const head=' '.repeat((mid-1))+'*'
xmasTree=xmasTree+head;return xmasTree}

언 골프 버전 :

function tree(i){
  const mid = (i+1)/2;
  const leg1 = ' '.repeat((mid-2)) + `___
`;
  const leg2 = ' '.repeat((mid-2)) + `\\ \/
`;
  const leg3 = ' '.repeat((mid-1)) + `|
`;
  let xmasTree = leg1 + leg2 + leg3;
  for (let j = 0; j<(i-4); j++) {
    if (j%2===0) {
      let v = j/2;
      let t = i-2*v-2;
      let body1 = " ".repeat(j/2)+"<"+"-".repeat(t) +">"+`
`;
      xmasTree = xmasTree + body1;
    } else {
      let k = 1 + Math.ceil(j/2);
      let h = i-2*k-2;
      let body2 = ' '.repeat(k)+ '<'+ '-'.repeat(h) + ">"+`
`;
      xmasTree = xmasTree + body2;
    }
  }
  const head = ' '.repeat((mid-1)) + '*'
  xmasTree = xmasTree + head;
  return xmasTree;
}

용법: console.log(tree(13)), console.log(tree(17)),

ES6 165 바이트 (친구로부터)

골프 버전 :

p=n=>{l=_=>console.log(`${' '.repeat((n-_.length)/2)}${_}`);t=_=>_==1?'*':'<'+'-'.repeat(_-2)+'>';x=n;l('___');l('\\ /');l('|');for(;x!==3;){l(t(x));l(t(x-4));x-=2}}

언 골프 버전 :

p = n => {
  l = _ => console.log(`${' '.repeat((n-_.length)/2)}${_}`);
  t = _ => _ == 1 ? '*' : '<' + '-'.repeat(_-2)+'>';
  x = n;
  l('___');l('\\ /');l('|');
  for(;x!==3;) {
    l(t(x)); l(t(x-4));x-=2;
  }
}

용법: p(31); p(17);


1
1 글자 변수 이름 만 사용하거나 const키워드를 제거하는 등의 방법으로 골프를 많이 할 수 있습니다.
FlipTack

1

PowerShell , 131 바이트

$i=2;$x="$args"..5|%{' '*($j=if($_%2){$i-2}else{($i++)})+'<'+'-'*($_-(5,2)[$_%2])+'>'};($y=' '*++$j)+"___";"$y\ /";"$y |";$x;"$y *"

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

글쎄, 이것은 PowerShell에 익숙하지 않은 사람에게는 엉망입니다 ... 그래서 어떻게 작동하는지 설명 할 수 있습니다.

설명을 위해을 사용 input = 17합니다.

우리는 도우미 변수를 설정하여, 간단한 충분를 시작 $i=2하고 설정 $x<something>으로, <something>입력의 범위로 시작 $args아래에 5, 그래서 17,16,15,...,6,5. 이 범위는 for 루프로 펌핑됩니다.

반복 할 때마다 헬퍼 변수 $jif명령문 의 결과 로 설정 하는 것으로 시작합니다 if($_%2){$i-2}else{($i++)}. 홀수이면 $j=$i-2, 그렇지 않으면 $j=($i++). 이것은 $i=2시작 부분 과 결합하여 0, 2, 1, 3, 2, 4, 3, 5...트리 라인 앞에 얼마나 많은 공간을 추가해야하는지 정확히 일치하는 시퀀스 를 제공 합니다. ;-) 우리는 ' '그것을 그 숫자로 빼고 문자열로 곱합니다.

다음으로 지점이 필요합니다. 이것은 '<'더하기 중간 부분을 '-'곱한 다음 끝으로 수행 '>'됩니다. 곱셈은 입력 숫자를 기반으로 -2, 5, 2, 5, 2...패턴 의 대체 패턴 을 인식하여 수행 $_되므로 해당 패턴을 기반으로 의사 삼항에서 선택합니다.

더 자세히 설명하기 위해 각 섹션의 첫 커플 용어는 다음과 같습니다.

$_ = 17 16 15 14 13 12 11 10
$j =  0  2  1  3  2  4  3  5
mid=  2  5  2  5  2  5  2  5
'-'= 15 11 13  9 11  7  9  5

이제 우리는 $x가지의 배열 (즉, 문자열)로 설정했습니다. 루프 외부에서 이제 적절한 수의 공간이 저장된 트리 "상단"을 $y만든 다음 분기를 표시 $x한 다음 트리를 "하단"으로 표시합니다 *. 이들 각각은 파이프 라인에 남아 있으며 항목 사이에 줄 바꿈이 표시됩니다.


1

자바 스크립트 (ES6), (150) 147 바이트

N=>{for(s=' '[r='repeat'](N/2-1),s+=`___
${s}\\ /
${s} |
`,n=N,l=n=>' '[r](N/2-n/2)+(n-1?`<${'-'[r](n-2)}>
`:'*');n-3;n-=2)s+=l(n)+l(n-4)
return s}



0
N=>{for(s=' '[r='repeat'](N/2-1),s+=`___
${s}\\ /
${s} |
`,l=n=>' '[r](N/2-n/2)+n-1?`<${'-'[r](n-2)}>
`:'*');N-=2;s+=l(N)+l(N-4);return s}

JS ESGoogoltriplex에 대한 나의 시도.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.