Hilf meiner verrückten Frau, unseren Weihnachtsbaum zu schmücken


36

Meine Frau ist sehr, sagen wir, besonders, wenn es darum geht, Ornamente auf unseren Weihnachtsbaum zu setzen. Lassen Sie uns ihr einen Code besorgen, der ihr in dieser schwierigen Zeit hilft.

Eingang

Bei einer Eingabe 2 < n < 10die Höhe des Baumes und 0 < k < ndie eindeutige Anzahl der Ornamente.

Aufgabe

Dekorieren Sie den Baum beginnend mit 1und inkrementieren Sie ihn, kwährend wir die Ornamente um den Baum wickeln. Wenn wir erreichen kund mehr Zweige zum Dekorieren haben, beginnen wir wieder bei 1.

Es ist in Ordnung, wenn sich nicht die gleiche Anzahl von Verzierungen auf dem Baum befindet, solange das Muster erfüllt ist.

Die Ornamente sollten mit ^Ausnahme der obersten Reihe über jedem Zweig erscheinen .

Der Baum ist so aufgebaut, dass er mit einer Verzweigung beginnt und die nächste Ebene + 1 Verzweigungen mit einem Leerzeichen dazwischen hat, das von oben versetzt ist:

 ^
^ ^

Für eine dritte Zeile würden Sie eine weitere Verzweigung hinzufügen und sie erneut so versetzen, dass sich keine Verzweigung in derselben Spalte befindet (wenn Sie sich das wie ein Raster vorstellen).

  ^
 ^ ^
^ ^ ^

Ausgabe

Gib deinen geschmückten Baum aus.

Beispiele

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Jetzt dekorieren wir jeden Zweig beginnend mit 1 und inkrementieren zu 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
^ ^ ^ ^ ^

Das ist also gewinnt der kürzeste Code! Viel Spaß und viel Glück!


Leerzeichen nach jeder Zeile akzeptabel?
Mukul Kumar

1
@ MukulKumar nein Es sollte die obige Struktur beibehalten.
Jacksonecac

Können wir annehmen, dass k kleiner als 10 ist? Oder wie kann man die Zahlen ausrichten?
Luis Mendo

2
@ LuisMendo Ja davon ausgehen, <10 guter Punkt
Jacksonecac

Antworten:


47

C # 226 221 Bytes

5 Bytes gespart dank @Mukul Kumar und @aloisdg

Golf gespielt:

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

Testen:

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

Edit: Ich hatte ein Schauspielcasting intzu ConsoleColor... Tis the season :)

Bildbeschreibung hier eingeben

MerryChristmas.gif

Bildbeschreibung hier eingeben


3
Sie können i=1die int-Deklaration eingeben und aus Ihrer forSchleife entfernen ...
Mukul Kumar

1
Sie können "\ r \ n" durch "\ n" ersetzen. Es läuft gut mit Kern und Mono.
aloisdg sagt Reinstate Monica

8
Schön zu sehen, dass eine C#Antwort etwas Liebe findet.
Michael McGriff

@aloisdg Danke :)
Pete Arden

1
@jacksonecac Schön, dass es Ihnen gefallen hat. Konnte nicht widerstehen, als die Idee in meinen Kopf kam :)
Pete Arden

14

05AB1E ,29 27 24 Bytes

Drei Bytes gespart dank 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

Probieren Sie es online!


2
Ich glaube , Sie ersetzen NN>*;durch NLO.
Adnan

Na sicher! Das ist lustig, weil ich eigentlich N*(N+1)/2absichtlich die Summe aufeinanderfolgender Ganzzahlen ab 1 berechnet habe, aber ich habe völlig vergessen, dass 05AB1E dafür eingebaute Funktionen hat. Vielen Dank!
Osable

2
Auch brauchst du das ïTeil jetzt: p?
Adnan

1
Ich glaube nicht ^^.
Osable

12

JavaScript (ES6), 97 Byte

Es sieht so aus, als ob Ihre Frau wirklich verrückt ist. Dies schließt weder führende oder nachfolgende Zeilenumbrüche noch führende oder nachfolgende Leerzeichen ein. :-)

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


8

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

Golf gespielt

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

Vielen Dank an @ cyoce für das Speichern von 1 Byte.
Thanks @ conor für hacken es auf 186 nach unten!

Ungolfed + kopieren & kompilieren

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

schließlich <200 ...
Mukul Kumar

1
Können Sie den Raum danach entfernen #define s(a)?
Cyoce

@Cyoce danke! Das wusste ich nicht !!!
Mukul Kumar

2
186 Bytes durch Ändern der Definition #define s std::cout<<und Vornehmen entsprechender Anpassungen.
Conor O'Brien

Woaa..das ist schön .. kam mir nie in den Sinn: p
Mukul Kumar

3

Python 2, 133 Bytes

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 Bytes

Mein erster Versuch mit Clojure Golf zu spielen:

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

Wenn es wie (println (str "\n" (d 6 5)))ein Newline aufgerufen wird, ist es auf REPL schöner:

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

Nicht golfen:

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

Ich hatte einige Probleme mit faulen Sequenzen und verschachtelten Listen, aber ich konnte einige Zeichen speichern, indem ich sie nicht wiederholte repeat;) und \^Zeichen anstelle von "^"Zeichenfolgen verwendete. Ich könnte auch überraschend viele Räume weglassen.


Schöne erste Antwort, willkommen auf der Seite!
DJMcMayhem

1

Ruby 107 Bytes

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

So genannt

t.call(5,4)

Ausgabe:

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

1

C 170 Bytes

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

Rufen Sie an mit:

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

Als Bonus gibt es hier eine 4-Bit-Binärversion:

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);}}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.