Castillo de naipes (versión 2)

8

Gracias a FryAmTheEggman por la idea de esta segunda versión.
Versión 1 aquí .

Desafío no tan simple: dada una cantidad de cartas, construye la mayor casa de cartas que puedas con esa cantidad de cartas, de acuerdo con el siguiente orden de construcción:

                          /\       /\         /\         /\/\
                 --       --       --         ----       ----
/\  →  /\/\  →  /\/\  →  /\/\  →  /\/\/\  →  /\/\/\  →  /\/\/\  →

                /\         /\
     --         --         --
    /\/\       /\/\       /\/\
    ----       ----       ----
→  /\/\/\  →  /\/\/\  →  /\/\/\/\  →  ...

Entonces comienza con una casa de una sola planta, luego construye el grupo adyacente, luego coloca la tarjeta de puente, luego construye el grupo en el segundo piso, luego comienza a construir grupos y puentes desde el primer piso en diagonal para llegar al tercer piso, y así en.

Una sola tarjeta se representará con a /, a \o a --. Si después de usar tantas cartas como sea posible, le queda una, simplemente envíe lo que ha logrado hasta ahora (vea el ejemplo para 3 cartas, el resultado es el mismo que para 2 cartas). La única excepción es el caso de 1 tarjeta, que debe generar una tarjeta plana.

Ejemplos:

Input: 1
Output: 

--   <a card lying on the floor>

Input: 2
Output:

/\

Input: 3
Output:

/\

Input: 5
Output:

 --
/\/\

Input: 10
Output:

 /\
 ----
/\/\/\

Input: 20
Output:

  /\
  --
 /\/\/\
 ------
/\/\/\/\

Input: 39
Output:

    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

Input: 40
Output:

    /\
    --
   /\/\
   ----
  /\/\/\
  ------
 /\/\/\/\
 --------
/\/\/\/\/\

La entrada puede ser numérica o una cadena, y siempre será un número entero positivo. La salida debe ser exactamente como se muestra, con espacios iniciales y finales y líneas nuevas permitidas.

Este es el , ¡así que puede ganar el programa / función más corto para cada idioma!

Charlie
fuente
Esto viene de la caja de arena .
Charlie
66
Es un desafío interesante, pero personalmente creo que debería haber esperado un poco más, tal vez un día, entre publicarlos.
caird coinheringaahing
@cairdcoinheringaahing Admito que no sabía cuánto tiempo debería haber esperado entre ambas publicaciones. Ha pasado un tiempo desde la última respuesta para la versión 1, así que supuse que podría publicarla ahora (24 horas después). Gracias por su consejo, lo tendré en cuenta la próxima vez.
Charlie
2
Si el ancho de una tarjeta puente no es cero, ¿no debería la salida de 1 tarjeta ser una tarjeta plana?
Peter Taylor
2
Creo que la mitad de los casos de prueba ahora están mal, porque no tienen en cuenta la posibilidad de poner una capa plana en la parte inferior. El sandbox realmente no funciona a menos que deje una pregunta allí durante unos días para que las personas tengan tiempo de comentar. (Y para la "parte 2" es importante dejar en claro que es una parte 2 para que la gente no piense que es la parte 1 y ya la han visto).
Peter Taylor

Respuestas:

4

Carbón , 67 bytes

Nθ⁼θ¹A²ηW¬‹θη«←÷η³↓→/…\/÷η³↙A⁻θηθA⁺³ηη»‖MM÷η³→Fθ≡﹪鳦¹«↗←\/»²«↑P²»«

Pruébalo en línea! Nota: La última versión de Charcoal no necesita el »«de -2 bytes. Explicación:

Nθ

Lea la entrada como un entero en θ.

⁼θ¹

Caso especial: si la entrada es 1, imprima a -.

A²ηW¬‹θη«

η representa el número de tarjetas necesarias para construir la siguiente capa, inicialmente 2. Un bucle while se repite siempre que haya suficientes tarjetas para la capa.

←÷η³↓→/…\/÷η³↙

Imprime la mitad izquierda de la siguiente capa. (Quería imprimir la mitad derecha, pero no pude hacer que se refleje correctamente por alguna razón). El número de -s es un tercio del número de tarjetas en la capa, redondeado hacia abajo. (Véase también mi respuesta a la parte 1.)

A⁻θηθA⁺³ηη»

Reste el número de tarjetas del número de entrada y agregue tres tarjetas al número requerido para la siguiente capa.

‖M

Refleja la casa hasta ahora. (Esto también lo convierte -en --el caso de 1 carta).

M÷η³→

Mueve el cursor a la derecha de la casa.

Fθ

Repita para cada tarjeta restante (si la hay).

≡﹪鳦

Si la tarjeta módulo 3 es:

¹«↗←\/»

1, luego imprime un par de cartas;

²«↑P²»

2, luego imprima una tarjeta horizontal;

«

De lo contrario, omita la tarjeta (porque se necesita un par en este punto).

Neil
fuente
Muy buena respuesta! ¿Comenzaste a escribirlo antes de cambiar la caja de 1 tarjeta? Ese caso debe emitirse --(una tarjeta plana), pero si inició su programa antes de que cambie ese requisito, lo omitiré ...
Charlie
@CarlosAlejo No, me había olvidado de ese caso. Lo siento por eso. Corregido ahora.
Neil
1
@Neil, ¿estás seguro de que no hiciste carbón? Porque estoy empezando a no creerte.
Magic Octopus Urn
@MagicOctopusUrn D: oye (pero sí, las habilidades de Neil's Charcoal son increíbles, probablemente incluso mejores que las mías, jaja)
Solo ASCII
Vaya, lo siento, se solucionará en la próxima confirmación
solo ASCII
2

Python 2 , 167 182 bytes

167 bytes

f=lambda x,y=0:y<x<2and"--"or~-x>y*3and f(x-2-y*3,y+1)or d(y,x)
d=lambda h,r,v=0:h and d(~-h,max(r-3,1),-~v)+" "*-~v+"--"*(h-(r<3))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"or""

182 bytes

f=lambda x,y=0:[x>1+y*3and f(x-2-y*3,y+1)or d(y,x),"--"][2>x>y]
d=lambda h,r,v=0:d(h-1,r-3*(r>2)-2*(r==2),v+1)+" "*(v+1)+"--"*(h-1+(r>2))+"\n"+" "*v+"/\\"*(h+(r>1))+"\n"if h+r else""

Explicación (versión de 167 bytes)

f=lambda x,y=0:
    "--" if y<x<2         # handle case where x is 1 on step 0 (only one card) 
    else f(x-2-y*3,y+1)   # recursive call with one full triangular level accounted for
    if x>= 2+y*3          # one full level requires 2+3y cards (2, 7, 15...)
    else d(y,x)           # if no more full levels can be constructed, draw
d=lambda h,r,v=0:         # (h)eight to draw, (r)emaining cards, (v)ertical height already drawn (to determine leading white space)
    d(h-1,          ,v+1) # recursive call to draw upper lines
          max(r-3,1)      # subtract remainder cards used in this iteration
    +" "*(v+1)            # leading whitespace for -- row
    +"--"*(       )+"\n"  # -- line. 
           h-(r<3)        # horizontal card count is equal to the remaining count of levels to draw, minus 1, 
                          # ...plus 1 if there are at least three remaining cards to add to the right
    +" "*v                # leading whitespace for /\ row
    +"/\\"*(       )+"\n" # /\ line
            h+(r>1)       # vertical card pair count equals remaining level count
                          # ...plus 1 if there are at least two extra cards
    if h                  # return above is there are levels to draw (h) 
    else ""               # else return nothing (ends recursion)

Pruébalo en línea!

  • Esto se siente innecesariamente largo, pero no puedo ver nada que eliminar en este momento ... siéntase libre de comentar cualquier sugerencia
Coty Johnathan Saxman
fuente
Muchas gracias por su respuesta, pero sus ejemplos no coinciden con los casos de prueba, coloca más tarjetas en sus casas de las que tiene. Por ejemplo, en el caso de 7 cartas, puedes construir una casa con 4 cartas en el primer piso, una tarjeta puente y 2 cartas más en el segundo piso. Pero muestra una casa con 10 cartas (6 cartas en el primer floow y 2 cartas puente). Verifique los ejemplos y la forma en que se construyen las casas.
Charlie
Continuemos esta discusión en el chat .
Coty Johnathan Saxman
Si desea separar las secciones de código que se suceden directamente entre sí, puede hacerlo utilizando las <pre><code>... </code></pre>etiquetas alrededor de los bloques individuales de su código en lugar de sangrar 4 espacios
Taylor Scott
1
Veo lo que sucedió: por alguna razón, cuando está usando las <pre><code>etiquetas, está capturando <3))+"\n"+" "*v+"/\\"*(h+(r>como otra etiqueta y no muestra esa región de la solución. Quizás alguien en la comunidad que entienda esto un poco mejor podría informarnos cómo evitar eso ... pero aparte de eso, su formato actual es perfectamente legible y, por lo tanto, niega la necesidad de este tipo de formato todos juntos
Taylor Scott
2
@TaylorScott Un poco tarde, pero puede solucionarlo reemplazándolos con entidades HTML: &lt;por <y &gt;para>
Business Cat
1

Perl 5 , 129 bytes

@r=($_=<>-2)<0?'--':'/\\';while($_>1){$#r+=2;$i=0;$r[$i].=$i++%2?'--':'/\\'while$i<@r&&($_-=2-$i%2)>=0}say$"x(@r/2).pop@r while@r

Pruébalo en línea!

Xcali
fuente