Aiuta mia moglie maniacale a decorare il nostro albero di Natale


36

Mia moglie è molto, diciamo, particolare quando si tratta di mettere ornamenti sul nostro albero di Natale. Prendiamo un po 'di codice per aiutarla in questo tempo di prova.

Ingresso

Dato un input 2 < n < 10l'altezza dell'albero e0 < k < n il numero distinto di ornamenti.

Compito

Decorare l'albero a partire da 1e incrementare kmentre avvolgiamo gli ornamenti attorno all'albero. Se raggiungiamo ke abbiamo più rami da decorare, ricominciamo 1.

Va bene se non c'è lo stesso numero di ogni ornamento sull'albero, purché il motivo sia soddisfatto.

Gli ornamenti dovrebbero apparire sopra ogni ramo ad ^eccezione della riga superiore.

L'albero è strutturato iniziando con un ramo, quindi il livello successivo ha + 1 rami con uno spazio tra ciascuno, sfalsati dall'alto come:

 ^
^ ^

Per una terza riga, aggiungi un altro ramo e sfalsalo di nuovo in modo tale che nessun ramo si trovi sulla stessa colonna (se la pensi come una griglia).

  ^
 ^ ^
^ ^ ^

Produzione

Crea il tuo albero decorato.

Esempi

1.

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Ora decoriamo ogni ramo a partire da 1 e incrementiamo a 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
^ ^ ^ ^ ^

Questo è quindi vince il codice più corto! Buon divertimento e buona fortuna!


spazi dopo ogni riga accettabili?
Mukul Kumar,

1
@MukulKumar no Dovrebbe mantenere la struttura sopra.
jacksonecac,

Possiamo assumere k meno di 10? Oppure, come allineare i numeri?
Luis Mendo,

2
@LuisMendo Sì supponiamo <10 buon punto
jacksonecac il

Risposte:


47

C # 226 221 byte

5 byte salvati grazie a @Mukul Kumar e @aloisdg

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:

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

Modifica: ho avuto un casting intper ConsoleColor... È la stagione :)

inserisci qui la descrizione dell'immagine

MerryChristmas.gif

inserisci qui la descrizione dell'immagine


3
Puoi dare i=1la dichiarazione int e rimuoverla dal tuo forciclo ...
Mukul Kumar il

1
Puoi sostituire "\ r \ n" con "\ n". Funzionerà bene con core e mono.
aloisdg dice Reinstate Monica il

8
È bello vedere una C#risposta ottenere un po 'd'amore.
Michael McGriff,

@aloisdg Thanks :)
Pete Arden il

1
@jacksonecac Sono contento che ti sia piaciuto. Non ho potuto resistere una volta che mi è venuta in mente l'idea :)
Pete Arden,

14

05AB1E ,29 27 24 byte

Hai salvato tre byte grazie ad 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

Provalo online!


2
Penso che puoi sostituirlo NN>*;con NLO.
Adnan,

Ovviamente! È divertente perché in realtà ho usato N*(N+1)/2intenzionalmente per ottenere la somma di numeri interi consecutivi a partire da 1, ma ho completamente dimenticato che 05AB1E aveva incorporato per quello. Grazie!
Osable,

2
Inoltre, hai bisogno della ïparte ora: p?
Adnan,

1
Non la penso così ^^.
Osable,

12

JavaScript (ES6), 97 byte

Sembra che tua moglie sia davvero maniacale, quindi questo non include alcuna riga iniziale o finale, né alcuno spazio iniziale o finale. :-)

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

dimostrazione


8

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

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

Grazie @ cyoce per aver salvato 1 byte.
Grazie @ Conor per tagliare verso il basso per 186!

Ungolfed + copia e compila

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

finalmente <200 ...
Mukul Kumar il

1
Puoi rimuovere lo spazio dopo #define s(a)?
Cyoce,

@Cyoce grazie! Non lo sapevo !!!
Mukul Kumar,

2
186 byte modificando la definizione in #define s std::cout<<e apportando le modifiche necessarie.
Conor O'Brien,

Woaa..questo bello .. non mi è mai passato per la testa: p
Mukul Kumar l'

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

Il mio primo tentativo di giocare a golf con 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")))))))

Quando chiamato come (println (str "\n" (d 6 5)))una newline lo rende più piacevole su REPL:

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

Un-giocato a 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))))))

Ho avuto dei problemi con le sequenze pigre e gli elenchi nidificati ma sono stato in grado di salvare alcuni caratteri non ripetendoli repeat;) e usando i \^caratteri invece delle "^"stringhe. Potrei anche lasciare sorprendentemente fuori molti spazi.


Bella prima risposta, benvenuto nel sito!
DJMcMayhem

1

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

Chiamato così

t.call(5,4)

Produzione:

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

Chiama con:

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

Come bonus, ecco una versione binaria a 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);}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.