Giúp vợ điên của tôi trang trí cây Giáng sinh của chúng tôi


36

Vợ tôi rất, đặc biệt là khi nói đến việc đặt đồ trang trí trên cây Giáng sinh của chúng tôi. Hãy lấy cho cô ấy một số mã để giúp cô ấy trong thời gian cố gắng này.

Đầu vào

Cho một đầu vào 2 < n < 10chiều cao của cây và 0 < k < nsố lượng đồ trang trí riêng biệt.

Bài tập

Trang trí cây bắt đầu 1và tăng dần kkhi chúng ta bọc các đồ trang trí xung quanh cây. Nếu chúng ta đạt được kvà chúng ta có nhiều chi nhánh để trang trí thì hãy bắt đầu lại 1.

Không sao nếu không có cùng số lượng của mỗi vật trang trí trên cây, miễn là mẫu đó được thỏa mãn.

Các đồ trang trí nên xuất hiện trên mỗi nhánh ^trừ hàng trên cùng.

Cây được cấu trúc bằng cách bắt đầu với một nhánh sau đó cấp tiếp theo có + 1 nhánh với khoảng cách giữa mỗi nhánh, được đặt so le từ trên xuống như:

 ^
^ ^

Đối với hàng thứ ba, bạn sẽ thêm một nhánh nữa và sắp xếp lại chúng sao cho không có nhánh nào nằm trên cùng một cột (nếu bạn nghĩ nó giống như một lưới).

  ^
 ^ ^
^ ^ ^

Đầu ra

Đầu ra cây trang trí của bạn.

Ví dụ

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Bây giờ chúng tôi trang trí mỗi nhánh bắt đầu bằng 1 và tăng lên 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
^ ^ ^ ^ ^ ^

3.

n = 5, k = 1

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

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

Đây là vì vậy đoạn mã ngắn nhất sẽ thắng! Chuc vui vẻ va nhiêu may măn nhe!


khoảng cách sau mỗi dòng có thể chấp nhận?
Mukul Kumar

1
@MukulKumar no Cần duy trì cấu trúc trên.
jacksonecac

Chúng ta có thể giả sử k dưới 10? Hoặc nếu không, làm thế nào để sắp xếp các con số?
Luis Mendo

2
@LuisMendo Có giả sử <10 điểm tốt
jacksonecac

Câu trả lời:


47

C # 226 221 byte

Đã lưu 5 Byte nhờ @Mukul Kumar và @aloitorg

Chơi gôn

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

Ung dung:

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

Kiểm tra:

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

Chỉnh sửa: Tôi đã có một vở kịch intđể ConsoleColor... Tis mùa :)

nhập mô tả hình ảnh ở đây

MerryChristmas.gif

nhập mô tả hình ảnh ở đây


3
Bạn có thể đưa ra i=1khai báo int và xóa nó khỏi forvòng lặp của bạn ...
Mukul Kumar

1
Bạn có thể thay thế "\ r \ n" bằng "\ n". Nó sẽ chạy tốt với lõi và đơn.
aloisdg nói Phục hồi lại

8
Thật tốt khi thấy một C#câu trả lời nhận được một số tình yêu.
Michael McGriff

@aloitorg Cảm ơn :)
Pete Arden

1
@jacksonecac Rất vui vì bạn thích nó. Không thể cưỡng lại một khi ý tưởng xuất hiện trong đầu tôi :)
Pete Arden

14

05AB1E ,29 27 24 byte

Đã lưu ba byte nhờ Adnan!

>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

Hãy thử trực tuyến!


2
Tôi nghĩ bạn có thể thay thế NN>*;bằng NLO.
Ad Nam

Tất nhiên! Điều đó thật buồn cười bởi vì tôi thực sự đã sử dụng một cách có N*(N+1)/2chủ ý để có được tổng số nguyên liên tiếp bắt đầu từ 1, nhưng tôi hoàn toàn quên rằng 05AB1E đã tích hợp sẵn cho điều đó. Cảm ơn!
Osable

2
Ngoài ra, bạn có cần ïmột phần bây giờ: p?
Ad Nam

1
Tôi không nghĩ vậy ^^.
Osable

12

JavaScript (ES6), 97 byte

Có vẻ như vợ bạn thực sự điên rồ, vì vậy điều này không bao gồm bất kỳ dòng mới hàng đầu hoặc cuối, cũng không có bất kỳ không gian hàng đầu hoặc dấu. :-)

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):''

Bản giới thiệu


8

C ++ 214 - 13 - 3 - 1 -1 - 10 = 186 byte

chơi gôn

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

Cảm ơn @ cyoce vì đã tiết kiệm 1 byte.
Cảm ơn @ conor đã cắt nó xuống còn 186!

Ungolfed + sao chép và biên dịch

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

cuối cùng <200 ...
Mukul Kumar

1
Bạn có thể loại bỏ không gian sau #define s(a)?
Cyoce

@Cyoce cảm ơn! Tôi không biết về điều đó !!!
Mukul Kumar

2
186 byte bằng cách thay đổi định nghĩa #define s std::cout<<và thực hiện theo điều chỉnh.
Conor O'Brien

Woaa..thật tốt đẹp .. không bao giờ vượt qua tâm trí của tôi: p
Mukul Kumar

3

Python 2, 133 byte

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

Clojure, 223 byte

Lần đầu tiên tôi chơi golf với 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")))))))

Khi được gọi như (println (str "\n" (d 6 5)))một dòng mới, làm cho nó đẹp hơn trên REPL:

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

Chưa chơi gôn:

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

Tôi gặp một số vấn đề với các chuỗi lười biếng và danh sách lồng nhau nhưng tôi có thể lưu một số ký tự bằng cách không lặp lại repeat;) và sử dụng các \^ký tự thay vì "^"chuỗi. Tôi cũng có thể rời khỏi nhiều không gian đáng ngạc nhiên.


Câu trả lời đầu tiên tốt đẹp, chào mừng đến với trang web!
DJMcMayhem

1

Ruby 107 byte

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

Được gọi như thế này

t.call(5,4)

Đầu ra:

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

1

C, 170 byte

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

Gọi với:

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

Là một phần thưởng, đây là phiên bản nhị phân 4 bit:

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);}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.