Ayuda a mi maníaca esposa a decorar nuestro árbol de navidad

36

Mi esposa es muy, digamos, particular cuando se trata de poner adornos en nuestro árbol de Navidad. Consigamos un código para ayudarla en este momento difícil.

Entrada

Dada una entrada, 2 < n < 10la altura del árbol y 0 < k < nel número distinto de adornos.

Tarea

Decora el árbol comenzando con 1e incrementa a kmedida que envolvemos los adornos alrededor del árbol. Si alcanzamos ky tenemos más ramas para decorar, entonces comencemos de nuevo 1.

Está bien si no hay el mismo número de cada adorno en el árbol, siempre que se satisfaga el patrón.

Los adornos deben aparecer encima de cada rama, ^excepto en la fila superior.

El árbol está estructurado comenzando con una rama, luego el siguiente nivel tiene + 1 ramas con un espacio entre cada una, escalonadas desde la parte superior como:

 ^
^ ^

Para una tercera fila, agregaría una rama más y las volvería a escalonar para que ninguna rama esté en la misma columna (si lo considera como una cuadrícula).

  ^
 ^ ^
^ ^ ^

Salida

Da salida a tu árbol decorado.

Ejemplos

1)

n = 3, k = 2

  ^      //Height is 3
 ^ ^
^ ^ ^

Ahora decoramos cada rama comenzando con 1 e incrementamos 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
^ ^ ^ ^ ^

Este es el por lo que gana el código más corto. ¡Diviértete y buena suerte!

jacksonecac
fuente
espacios aceptables después de cada línea?
Mukul Kumar
1
@MukulKumar no Debe mantener la estructura anterior.
jacksonecac
¿Podemos suponer k menos de 10? O bien, ¿cómo alinear los números?
Luis Mendo
2
@LuisMendo Sí, supongo <10 buen punto
jacksonecac

Respuestas:

47

C # 226 221 Bytes

Guardado 5 bytes gracias a @Mukul Kumar y @aloisdg

Golfizado:

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

Sin golf:

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

Pruebas:

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

Editar: Tuve un casting intpara ConsoleColor... Esta es la temporada :)

ingrese la descripción de la imagen aquí

MerryChristmas.gif

ingrese la descripción de la imagen aquí

Pete Arden
fuente
3
Puede dar i=1la declaración int y eliminarla de su forbucle ...
Mukul Kumar
1
Puede reemplazar "\ r \ n" con "\ n". Funcionará bien con núcleo y mono.
aloisdg dice Reinstate Monica
8
Es bueno ver una C#respuesta obteniendo un poco de amor.
Michael McGriff
@aloisdg Gracias :)
Pete Arden
1
@jacksonecac Me alegro de que lo hayas disfrutado. No pude resistir una vez que se me ocurrió la idea :)
Pete Arden
14

05AB1E ,29 27 24 bytes

¡Ahorré tres bytes gracias a 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

Pruébalo en línea!

Osable
fuente
2
Creo que puedes reemplazar NN>*;por NLO.
Adnan
¡Por supuesto! Eso es divertido porque en realidad lo usé N*(N+1)/2intencionalmente para obtener la suma de enteros consecutivos a partir de 1, pero olvidé por completo que 05AB1E tenía incorporados para eso. ¡Gracias!
Osable
2
Además, ¿necesita la ïparte ahora: p?
Adnan
1
No lo creo ^^.
Osable
12

JavaScript (ES6), 97 bytes

Parece que su esposa realmente es maníaca, por lo que esto no incluye ninguna línea nueva inicial o posterior, ni ningún espacio inicial o final. :-)

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

Manifestación

Arnauld
fuente
8

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

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

Gracias @ cyoce por guardar 1 byte.
Gracias @ conor para cortar hacia abajo a 186!

Ungolfed + copiar y compilar

#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
fuente
finalmente <200 ...
Mukul Kumar
1
¿Puedes quitar el espacio después #define s(a)?
Cyoce
@Cyoce gracias! ¡No sabía sobre eso!
Mukul Kumar
2
186 bytes cambiando la definición #define s std::cout<<y haciendo los ajustes correspondientes.
Conor O'Brien
Woaa ... eso es agradable ... nunca se me pasó por la mente: 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
TFeld
fuente
2

Clojure, 223 bytes

Mi primera vez en 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")))))))

Cuando se llama como (println (str "\n" (d 6 5)))una nueva línea lo hace más agradable en REPL:

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

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

Tuve algunos problemas con las secuencias perezosas y las listas anidadas, pero pude guardar algunos caracteres al no repetirlos repeat;) y al usar \^caracteres en lugar de "^"cadenas. También podría dejar fuera sorprendentemente muchos espacios.

NikoNyrh
fuente
Buena primera respuesta, bienvenido al sitio!
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}}

Llamado así

t.call(5,4)

Salida:

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

Llamar con:

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

Como beneficio adicional, aquí hay una versión binaria de 4 bits:

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
fuente