Bantu istri gila saya menghias pohon Natal kami

36

Istri saya sangat, katakanlah, khususnya dalam hal meletakkan hiasan di pohon Natal kami. Mari kita beri dia beberapa kode untuk membantunya dalam masa percobaan ini.

Memasukkan

Diberikan input 2 < n < 10ketinggian pohon dan 0 < k < njumlah ornamen yang berbeda.

Tugas

Hiasi pohon dimulai dengan 1dan knaik saat kita membungkus ornamen di sekitar pohon. Jika kami mencapai kdan kami memiliki lebih banyak cabang untuk didekorasi kemudian mulai kembali 1.

Tidak apa-apa jika tidak ada jumlah yang sama dari setiap ornamen di pohon, selama polanya puas.

Ornamen harus muncul di atas setiap cabang ^kecuali untuk baris atas.

Pohon terstruktur dengan memulai dengan satu cabang kemudian tingkat berikutnya memiliki +1 cabang dengan ruang di antara masing-masing, terhuyung-huyung dari atas seperti:

 ^
^ ^

Untuk baris ketiga, Anda akan menambahkan satu cabang lagi dan sempoyongan lagi sehingga tidak ada cabang di kolom yang sama (jika Anda menganggapnya seperti kisi).

  ^
 ^ ^
^ ^ ^

Keluaran

Keluarkan pohon hias Anda.

Contohnya

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Sekarang kita menghias masing-masing cabang dimulai dengan 1 dan naik ke 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
^ ^ ^ ^ ^

Ini adalah sehingga kode terpendek menang! Selamat bersenang-senang dan semoga berhasil!

jacksonecac
sumber
spasi setelah setiap baris dapat diterima?
Mukul Kumar
1
@MukulKumar no Ini harus mempertahankan struktur di atas.
jacksonecac
Bisakah kita menganggap k kurang dari 10? Atau yang lain, bagaimana cara menyelaraskan angka?
Luis Mendo
2
@LuisMendo Ya anggap <10 poin bagus
jacksonecac

Jawaban:

47

C # 226 221 Bytes

Disimpan 5 Bytes berkat @Mukul Kumar dan @aloisdg

Golf:

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

Tidak Disatukan:

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

Pengujian:

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

Sunting: Saya menjalani casting intuntuk ConsoleColor... Ini musimnya :)

masukkan deskripsi gambar di sini

MerryChristmas.gif

masukkan deskripsi gambar di sini

Pete Arden
sumber
3
Anda dapat memberikan i=1deklarasi int dan menghapusnya dari forloop Anda ...
Mukul Kumar
1
Anda dapat mengganti "\ r \ n" dengan "\ n". Ini akan berjalan baik dengan core dan mono.
aloisdg mengatakan Reinstate Monica
8
Senang melihat C#jawaban mendapatkan cinta.
Michael McGriff
@aloisdg Terima kasih :)
Pete Arden
1
@ jacksonecac Senang Anda menikmatinya. Tidak dapat menolak begitu ide muncul di benak saya :)
Pete Arden
14

05AB1E ,29 27 24 byte

Disimpan tiga byte berkat 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

Cobalah online!

Osable
sumber
2
Saya pikir Anda bisa menggantinya NN>*;dengan NLO.
Adnan
Tentu saja! Itu lucu karena saya sebenarnya menggunakan N*(N+1)/2sengaja untuk mendapatkan jumlah bilangan bulat berturut-turut mulai dari 1, tapi saya benar-benar lupa bahwa 05AB1E memiliki built-in untuk itu. Terima kasih!
Osable
2
Juga, apakah Anda memerlukan ïbagian sekarang: p?
Adnan
1
Saya kira tidak ^^.
Osable
12

JavaScript (ES6), 97 byte

Sepertinya istri Anda benar - benar gila, jadi ini tidak termasuk baris baru yang mengarah atau tertinggal, atau ruang terkemuka atau tertinggal. :-)

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

Demo

Arnauld
sumber
8

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

bermain golf

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

Terima kasih @ cyoce untuk menghemat 1 byte.
Terima kasih @ conor untuk memotongnya menjadi 186!

Salinan + kompilasi yang tidak dikumpulkan

#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
}  
Mukul Kumar
sumber
akhirnya <200 ...
Mukul Kumar
1
Bisakah Anda menghapus ruang setelahnya #define s(a)?
Cyoce
@ Ayo, terima kasih! Saya tidak tahu tentang itu !!!
Mukul Kumar
2
186 byte dengan mengubah define ke #define s std::cout<<dan membuat penyesuaian yang sesuai.
Conor O'Brien
Woaa..itu bagus .. tidak pernah terlintas di benak saya: 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
TFeld
sumber
2

Clojure, 223 byte

Go pertama saya bermain golf bersama 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")))))))

Ketika dipanggil seperti (println (str "\n" (d 6 5)))baris baru, membuatnya lebih baik di REPL:

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

Tidak golf:

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

Saya memiliki beberapa masalah dengan urutan malas dan daftar bersarang tetapi saya dapat menyimpan beberapa karakter dengan tidak mengulang repeat;) dan menggunakan \^karakter alih-alih "^"string. Saya juga bisa meninggalkan banyak ruang yang mengejutkan.

NikoNyrh
sumber
Jawaban pertama yang bagus, selamat datang di situs ini!
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}}

Disebut seperti ini

t.call(5,4)

Keluaran:

    ^
   1 2
   ^ ^
  3 4 1
  ^ ^ ^
 2 3 4 1
 ^ ^ ^ ^
2 3 4 1 2
^ ^ ^ ^ ^
Neil Slater
sumber
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);}}

Telepon dengan:

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

Sebagai bonus, inilah versi biner 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);}}
Steadybox
sumber