Manyak karımın Noel ağacımızı dekore etmesine yardım et


36

Karım çok, diyelim ki, özellikle Noel ağacımıza süsler koymak söz konusu olduğunda. Bu deneme zamanında ona yardım etmesi için ona bir kod verelim.

Giriş

Bir girdi göz önüne alındığında 2 < n < 10ağacın yüksekliği ve 0 < k < nfarklı süs sayıları.

Görev

Ağaç ile başlangıç süsleyin 1ve artışı kbiz ağacın etrafında süsler sarın olarak. Ulaşırsak kve süslemek için daha fazla şubemiz varsa, o zaman baştan başlar 1.

Ağaçta her süslemenin aynı sayıda olmaması, kalıp tatmin edildiği sürece sorun olmaz.

Süsler ^, üst sıra hariç her dalın üzerinde görünmelidir .

Ağaç, bir daldan başlayarak yapılandırılır, daha sonra bir sonraki seviye, her biri arasında boşluk bırakarak, yukarıdan aşağıdakine göre:

 ^
^ ^

Üçüncü bir satır için bir dal daha ekler ve aynı dalda hiçbir dalın olmaması için tekrar düzenlersiniz (bir ızgara gibi düşünürseniz).

  ^
 ^ ^
^ ^ ^

Çıktı

Süslü ağacını çıkar.

Örnekler

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Şimdi her bir dalı 1 ile başlayan ve k'ya yükselterek dekore ediyoruz:

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

Bu yani en kısa kod kazanır! Eğlenmene bak ve iyi şanslar!


Her satırdan sonra boşluklar kabul edilebilir mi?
Mukul Kumar

1
@MukulKumar no Yukarıdaki yapıyı korumalıdır.
jacksonecac,

K'nin 10'dan az olduğunu varsayabilir miyiz? Ya da sayıları nasıl hizalayacağınızı?
Luis Mendo

2
@LuisMendo Evet, <10 iyi nokta olduğunu varsayalım
jacksonecac

Yanıtlar:


47

C # 226 221 Bayt

@Mukul Kumar ve @aloisdg sayesinde 5 bayt kaydedildi

golfed:

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

Ungolfed:

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

Test yapmak:

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

Düzenleme: döküm bir oyun vardı intiçin ConsoleColor... Tis sezon :)

görüntü tanımını buraya girin

MerryChristmas.gif

görüntü tanımını buraya girin


3
i=1İnt bildirimde verebilir ve bunu for
döngünüzden

1
"\ R \ n" yerine "\ n" yazabilirsiniz. Çekirdek ve mono ile iyi çalışacak.
aloisdg diyor ki

8
Biraz sevişen bir C#cevap görmek güzel .
Michael McGriff,

@aloisdg Teşekkürler :)
Pete Arden,

1
@jacksonecac Bunu beğendiğinize sevindim. Fikir kafamın içine girdiğinde
Pete Arden

14

05AB1E ,29 27 24 bayt

Adnan sayesinde üç bayt kurtarıldı!

>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

Çevrimiçi deneyin!


2
Sana yerini alabilir mi NN>*;tarafından NLO.
Adnan

Tabii ki! Bu komik çünkü aslında N*(N+1)/2kasıtlı olarak 1'den başlayan ardışık tam sayıların toplamını elde etmek için kullandım , ancak 05AB1E'nin bunun için yerleşik olduğunu tamamen unuttum. Teşekkürler!
Osable

2
Ayrıca, ïşimdi parçaya ihtiyacınız var mı: p?
Adnan

1
Sanmıyorum ^^
Osable

12

JavaScript (ES6), 97 bayt

Görünen o ki, karınız gerçekten manyak gibi görünüyor ; bu nedenle, bu bir baştaki ya da sondaki yeni hattı ya da baştaki ya da sondaki alanı içermez. :-)

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

gösteri


8

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

golfed

#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 byte tasarruf için teşekkürler @ cyoce.
İçin conor @ teşekkürler doğrama 186 için aşağı!

Ungolfed + kopyala ve derle

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

Sonunda <200 ...
Mukul Kumar

1
Sonra boşluğu kaldırabilir misin #define s(a)?
Cyoce

@Cyoce teşekkürler! Bunu bilmiyordum !!!
Mukul Kumar,

2
186 byte ile tanım değiştirerek #define s std::cout<<ve ayarlamalar yaparak.
Conor O'Brien,

Vay canına .. bu çok güzel .. aklımdan hiç geçmedi: p
Mukul Kumar

3

Python 2, 133 bayt

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 bayt

Clojure ile golfe ilk başladığımda:

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

Yeni (println (str "\n" (d 6 5)))bir satır gibi çağrıldığında REPL'de daha iyi hale gelir:

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

Un-golfed:

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

Tembel diziler ve iç içe geçmiş listelerle ilgili bazı problemlerim vardı ancak yinelenerek repeat;) ve \^karakter yerine karakter kullanarak bazı karakterleri kaydedebildim "^". Şaşırtıcı bir şekilde birçok alanı da bırakabilirim.


Güzel ilk cevap, siteye hoş geldiniz!
DJMcMayhem

1

Yakut 107 bayt

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

Böyle denir

t.call(5,4)

Çıktı:

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

1

C, 170 bayt

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

İle ara:

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

Bonus olarak, işte 4 bitli ikili sürüm:

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);}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.