열광적 인 아내가 크리스마스 트리를 장식하도록 도와주세요


36

제 아내는 크리스마스 트리에 장식품을 놓을 때 특히 그렇습니다. 이 시련을 겪을 때 도움이 될 몇 가지 코드를 알려 드리겠습니다.

입력

2 < n < 10나무의 높이와 0 < k < n별개의 수의 장식물을 입력 하십시오 .

태스크

장식물을 나무 주위에 감쌀 때 부터 나무를 장식 1하고 증가시킵니다 k. 우리가 도달 k하고 꾸미는 더 많은 가지가 있다면 에서 다시 시작하십시오 1.

패턴이 충족되는 한 트리에 각 장식의 개수가 동일하지 않으면 괜찮습니다.

장식품은 ^맨 위 줄을 제외하고 각 가지 위에 나타납니다 .

트리는 하나의 브랜치로 시작하여 다음 레벨에 +1 개의 브랜치가 있으며, 그 사이에 공백이 있으며, 위에서 아래로 엇갈려 있습니다.

 ^
^ ^

세 번째 행의 경우 분기를 하나 더 추가하고 다시 엇갈리게 배치하여 동일한 열에 분기가 없도록하십시오 (그리드처럼 생각할 경우).

  ^
 ^ ^
^ ^ ^

산출

장식 된 나무를 출력하십시오.

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

이제 1부터 시작하여 k로 증가하는 각 분기를 장식합니다.

  ^
 1 2
 ^ ^
1 2 1
^ ^ ^

2.

n = 6, k = 5

     ^    //Non-Decorated
    ^ ^
   ^ ^ ^
  ^ ^ ^ ^
 ^ ^ ^ ^ ^
^ ^ ^ ^ ^ ^

     ^    //Decorated
    1 2
    ^ ^
   3 4 5
   ^ ^ ^
  1 2 3 4
  ^ ^ ^ ^
 5 1 2 3 4
 ^ ^ ^ ^ ^
5 1 2 3 4 5
^ ^ ^ ^ ^ ^

삼.

n = 5, k = 1

    ^
   ^ ^
  ^ ^ ^
 ^ ^ ^ ^
^ ^ ^ ^ ^

    ^
   1 1
   ^ ^
  1 1 1
  ^ ^ ^
 1 1 1 1
 ^ ^ ^ ^
1 1 1 1 1
^ ^ ^ ^ ^

이것은 이므로 가장 짧은 코드가 승리합니다! 재미와 행운을 빕니다!


허용되는 각 줄 뒤에 공백?
Mukul Kumar

1
@MukulKumar 아니오 위의 구조를 유지해야합니다.
jacksonecac

k를 10보다 작게 가정 할 수 있습니까? 아니면 숫자를 정렬하는 방법?
Luis Mendo

2
@LuisMendo 예 가정 <10 good point
jacksonecac

답변:


47

C # 226221 바이트

@Mukul Kumar 및 @aloisdg 덕분에 5 바이트 절약

골프 :

string C(int n,int k){string o="",x;int j=1,i=1,m;for(;i<=n;i++){o+=string.Concat(Enumerable.Repeat("^ ",i)).PadLeft(n+i)+"\n";m=0;x="";if(i<n){while(m<i+1){if(j>k)j=1;x+=j+++" ";m++;}o+=x.PadLeft(n+i+1)+"\n";}}return o;}

언 골프 드 :

public string C(int n, int k, WifeMode wifeMode = WifeMode.Maniacal)
{
  string o = "",x;
  int j = 1,i=1,m;

  for (; i <= n; i++)
  {
    o += string.Concat(Enumerable.Repeat("^ ", i)).PadLeft(n+i) + "\n";

    m = 0;
    x = "";

    if (i < n)
    {
      while (m < i + 1)
      {
        if (j > k) j = 1;
        x += j++ + " ";
        m++;
      }

      o += x.PadLeft(n + i + 1) + "\n";
    }
  }

  return o;
}

테스트 :

Console.Write(new ChristmasTreeDecorating().C(20, 9));

                   ^ 
                  1 2 
                  ^ ^ 
                 3 4 5 
                 ^ ^ ^ 
                6 7 8 9 
                ^ ^ ^ ^ 
               1 2 3 4 5 
               ^ ^ ^ ^ ^ 
              6 7 8 9 1 2 
              ^ ^ ^ ^ ^ ^ 
             3 4 5 6 7 8 9 
             ^ ^ ^ ^ ^ ^ ^ 
            1 2 3 4 5 6 7 8 
            ^ ^ ^ ^ ^ ^ ^ ^ 
           9 1 2 3 4 5 6 7 8 
           ^ ^ ^ ^ ^ ^ ^ ^ ^ 
          9 1 2 3 4 5 6 7 8 9 
          ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
         1 2 3 4 5 6 7 8 9 1 2 
         ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
        3 4 5 6 7 8 9 1 2 3 4 5 
        ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
       6 7 8 9 1 2 3 4 5 6 7 8 9 
       ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
      1 2 3 4 5 6 7 8 9 1 2 3 4 5 
      ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
     6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 
     ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
    3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 
    ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
   1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 
   ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
  9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 
  ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 
 ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ 
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 
^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^

편집 : 나는 플레이 캐스팅 int했다 ConsoleColor... 시즌 Tis :)

여기에 이미지 설명을 입력하십시오

MerryChristmas.gif

여기에 이미지 설명을 입력하십시오


3
당신은 줄 수 i=1INT 선언과에서 제거 for... 루프
Mukul을 쿠마에게

1
"\ r \ n"을 "\ n"으로 바꿀 수 있습니다. 코어와 모노에서 잘 작동합니다.
aloisdg는 Reinstate Monica가

8
C#사랑을 얻는 답 을 보게되어 반갑습니다 .
Michael McGriff

@aloisdg Thanks :)
Pete Arden

1
@jacksonecac 즐거웠습니다. 생각이 내 머리 :)에 와서 한 번에 저항 할 수 없습니다
피트 아덴

14

05AB1E ,29 27 24 바이트

Adnan 덕분에 3 바이트를 절약했습니다!

>GN„^ ×NÝNLO<+²%>ðý}\».c

>G                       For N in [1, ..., input[0]]
  N„^ ×                  Push a string of "^ " N times
       NÝ                Push [0, ..., N]
         NLO<            Compute the decoration offset, sum([1, ..., N])-1
             +           Add the offset value to each array cell
              ²%         Modulo input[1]
                >        Add 1 so that it is in range [1, k] instead of [0, k-1]
                 ðý      Join with spaces, now we have a string with the full decoration for the current layer
                   }     End for
                    \    Remove the last decoration
                     »   Join everything with newlines
                      .c Center all and implicitly display

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


2
나는 당신이 바꿀 수 있다고 생각 NN>*;하여 NLO.
Adnan

물론이야! 실제로 N*(N+1)/21부터 시작하는 연속 정수의 합계를 얻기 위해 의도적으로 사용했기 때문에 재미 있지만 05AB1E에 내장 된 것을 완전히 잊었습니다. 감사!
Osable

2
또한, ï지금 부품 이 필요 합니까? : p?
Adnan

1
나는 그렇게 생각하지 않는다 ^^.
Osable

12

JavaScript (ES6), 97 바이트

아내가 실제로 광신적 인 것처럼 보이 므로 선행 또는 후행 줄 바꿈이나 선행 또는 후행 공간은 포함되지 않습니다. :-)

f=(n,k,x,s=`^
`)=>n--?(p=' '.repeat(n)+s,x?p.replace(/\^/g,_=>x++%k+1)+p:p)+f(n,k,x||k,'^ '+s):''

데모


8

C ++ 214-13-3-1-1-1-10 = 186 바이트

골프

#define s std::cout<<
int f(int n,int k){int N=++n,K=0,i=0,I;for(;i<n;i++,N--){for(I=N;I--;)s' ';for(I=0;I++<i&&i-1;)s' '<<(K++%k)+1;s'\n';for(I=N;I--;)s' ';for(I=0;I++<i;)s" ^";s'\n';}}  

1 바이트를 저장해 주셔서 감사합니다 @ cyoce.
대한 코너 @ 감사 도마 (186)에 내려!

Ungolfed + 복사 및 컴파일

#include<iostream>
#include<conio.h>

#define s(a) std::cout<<a;

int main()
{
    int n,N,k,K=0,i,I;
    std::cin>>n>>k;
    N=++n;
    for(i=0;i<n;i++,N--)
    {
        for(I=N;I--;)

            s(' ')

        for(I=0;I<i&&i-1;I++)

            s(' '<<(K++%k)+1)

        s('\n')

        for(I=N;I;I--)

            s(' ')

        for(I=0;I<i;I++)

            s(" ^")

        s('\n')

    }
    getch();//or any func to pause the console
}  

마지막으로 <200 ...
Mukul Kumar

1
당신은 후에 공간을 제거 할 수 있습니까 #define s(a)?
Cyoce

@Cyoce 감사합니다! 나는 그것에 대해 몰랐다! !!
Mukul Kumar

2
정의를 변경하고 #define s std::cout<<이에 따라 조정 하여 186 바이트 .
Conor O'Brien

Woaa .. 멋져요 .. 절대로 내 마음을 넘지 않았습니다 : p
Mukul Kumar

3

파이썬 2, 133 바이트

n,k=input()
d=-1
j=' '.join
for i in range(1,n+1):s=' '*(n-i);print(['',s+j(`x%k+1`for x in range(d,d+i))+'\n'][i>1]+s+j('^'*i));d+=i

2

클로저, 223 바이트

Clojure와 함께 골프를 타러갑니다.

(let[r repeat](defn d[n k](apply str(concat(r(dec n)\ )"^\n"(flatten(for[i(range 2(inc n))m[nil true]](concat(r(- n i)\ )(butlast(interleave(if m(r\^)(rest(iterate #(inc(mod % k))(dec(/(* i(dec i))2)))))(r i\ )))"\n")))))))

(println (str "\n" (d 6 5)))개행 처럼 호출되면 REPL에서 더 멋지게 만듭니다.

     ^
    1 2
    ^ ^
   3 4 5
   ^ ^ ^
  1 2 3 4
  ^ ^ ^ ^
 5 1 2 3 4
 ^ ^ ^ ^ ^
5 1 2 3 4 5
^ ^ ^ ^ ^ ^

언 골프 :

(defn tree-row [n k index mode]
  (concat
    (repeat (- n index) \ ) ; Left padding
    (butlast ; Removing trailing space
      (interleave
        ; Either printing carets or numbers...
        (if mode
          (repeat \^)
          ; Using "rest" as the iteration starts from a large value
          ; from which the modulo has not been calculated yet.
          (rest (iterate #(inc (mod % k)) (dec (/ (* index (dec index)) 2)))))
        ; ...and interleaved with spaces
        (repeat index \ )))
    "\n"))

(defn decorate [n k]
  (apply str (concat
               (repeat (dec n) \ ) "^\n"
               (flatten (for [index (range 2 (inc n)) mode [nil true]]
                          (tree-row n k index mode))))))

지연 시퀀스 및 중첩 목록에 문제가 있었지만 repeat;)을 반복하지 \^않고 "^"문자열 대신 문자를 사용하여 일부 문자를 저장할 수있었습니다 . 놀랍게도 많은 공간을 남길 수도 있습니다.


좋은 첫 답변, 사이트에 오신 것을 환영합니다!
DJMcMayhem

1

루비 107 바이트

t=->(n,k){d=[*1..k]*n*n;o=0;(1..n).each{|b|s=' '*(n-b);b>1&&(puts(s+d[o,b].join(' '));o+=b);puts s+'^ '*b}}

이렇게 불러

t.call(5,4)

산출:

    ^
   1 2
   ^ ^
  3 4 1
  ^ ^ ^
 2 3 4 1
 ^ ^ ^ ^
2 3 4 1 2
^ ^ ^ ^ ^

1

C, 170 바이트

i=0;d,j,l;t(n,k){char s[20],r[20];d=k-2;l=n;for(;i++<n;){for(j=0;j<l;++j)s[j]=r[j]=32;for(j=n-i;j<l;j+=2){s[j]=94;r[j]=(++d%k)+49;}s[l]=r[l++]=0;if(i-1)puts(r);puts(s);}}

전화 :

int main()
{
   t(5,4);
}

보너스로, 여기 4 비트 바이너리 버전이 있습니다 :

m=0;b(n,k){char*a="000100100011010001010110011110001001";char s[20],r[20];d=k*4-2;l=n;for(;m++<n;){for(j=0;j<l;++j)s[j]=r[j]=32;for(j=n-m;j<l;j+=2){s[j]=94;r[j]=a[++d%(k*4)];}s[l]=r[l++]=0;if(m-1)puts(r);puts(s);}}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.