Construir una escalera para mi hijo

25

El otro día, mi hijo me pidió que le construyera una escalera usando bloques Lego-ish. Y se me ocurrió algo como esto:

Escalera

Entonces mi hijo me pidió un programa que utilizara la menor cantidad de bytes que generara una escalera similar en la pantalla de una computadora. No soy tan bueno en , así que necesito tu ayuda. Necesito un programa que:

  • Recibe un número entero positivo con el número de niveles que debe tener la escalera.
  • Emite un dibujo de una escalera, con el patrón que ve en la imagen.

La salida estará en formato de texto, pero los ladrillos se pueden distinguir uno del otro. Por ejemplo, puede usar el carácter '█' como medio bloque y pintarlo del color que desee, o simplemente elegir cualquier personaje de su elección.

Restricciones

  • Los bloques deben ser de tres colores diferentes, que se usarán el mayor tiempo posible (si la entrada es 1 o 2, no hay suficientes bloques para usar los tres colores). Si lo desea, puede usar los caracteres '░▒▓', por ejemplo, o simplemente seleccionar tres caracteres diferentes.
  • No hay dos bloques del mismo color o patrón que puedan estar de lado a lado en una sola fila.

A mi hijo realmente no le importan los espacios finales o las nuevas líneas siempre que se dibuje una escalera.

Ejemplos (perdón por la mala elección de personajes):

Input: 1
Output:
██

Input: 2
Output:
██
 ▓▓

Input: 3
Output:
██
 ▓▓
██░░

Input: 5
Output:
██
 ██
██░░
 ██░░
██░░▓▓
Charlie
fuente
17
Dígale a su hijo que lo divertido es construirlo / programarlo él mismo :-)
Luis Mendo
3
Bienvenido al sitio! La combinación de arte ASCII y salida gráfica generalmente está mal vista, ya que resulta en una especie de dos desafíos paralelos. Además, si opta por ASCII, permitiría que se usen caracteres ASCII reales (creo que ya lo hace, pero tal vez sea más explícito), ya que algunos idiomas pueden tener dificultades con caracteres no ASCII
Luis Mendo
2
FYI los bloques se llaman Duplo
caird coinheringaahing
10
@cairdcoinheringaahing duplo no tiene botones redondos.
Christoph
3
@cairdcoinheringaahing Los bloques en la Pregunta no son Duplo, Duplo es compatible con Lego , esos son Lego Baby . Originalmente se llamaban Duplo Primo y desearía que tuvieran un nombre diferente a cualquiera de esos dos, pero técnicamente son un producto diferente que Lego y Duplo.
Draco18s

Respuestas:

5

Jalea ,  21 19  16 bytes

d2SR+%3x2⁶;ṙḂµ€Y

Un programa completo que imprime el resultado.

Usos 00, 11y 22como los bloques.

Pruébalo en línea!

¿Cómo?

d2SR+%3x2⁶;ṙḂµ€Y - Main link: number n
             µ€  - for €ach "row" in n (i.e. for row, r = 1 to n inclusive):
d2               -   divmod 2   -> [integer-divide by 2, remainder] i.e. [r/2, r%2]
  S              -   sum        -> r/2 + r%2
   R             -   range      -> [1, 2, 3, ..., r/2 + r%2]
    +            -   add r      -> [r+1, r+2, r+3, ..., r + r/2 + r%2]
     %3          -   modulo 3   -> [r%3+1, r%3+2, r%3+0, ..., (r + r/2 + r%2)%3]
                 -   e.g.: r: 1  , 2  , 3    , 4    , 5      , 6      , 7       , ...
                             [2], [0], [1,2], [2,0], [0,1,2], [1,2,0], [2,0,1,2], ...
       x2        -   times 2 - repeat each twice (e.g. [2,0,1,2] -> [2,2,0,0,1,1,2,2]
         ⁶       -   literal space character
          ;      -   concatenate (add a space character to the left)
            Ḃ    -   r mod 2 (1 if the row is odd, 0 if it is even (1 at the top))
           ṙ     -   rotate (the list) left by (r mod 2)
               Y - join with newlines
                 - implicit print (no brackets printed due to the presence of characters)
Jonathan Allan
fuente
11

Python 2 , 55 bytes

i=2
exec"print(i%2*' '+`2%i*1122`*i)[:i];i+=1;"*input()

Pruébalo en línea!

Ciclos entre bloques de 22, 44, excepto la fila superior es 00. Por ejemplo, en la entrada 10, imprime

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422
 2244224422

Imprime filas de longitud creciente i=2,3,..creando un espacio para longitudes impares, repitiendo los itiempos del patrón y truncando a la longitud i. El patrón es 2244para todas las filas, excepto la primera i=2para la que es 0. Esto se logra con la expresión aritmética 2%i*1122.

xnor
fuente
1
Utiliza solo dos colores para el caso 3.
Christoph
Muy inteligente solución!
Charlie
4

JavaScript (ES6), 80 bytes

n=>eval(`for(s=11,i=1;i++<n;)s+='\\n'+(' '+'2233'.repeat(n)).substr(i%2,i+1);s`)


JavaScript (ES6), 87 bytes

Solución previa

n=>[11,...Array(n).fill(' '+'2233'.repeat(n)).map((r,n)=>r.slice(n%2,n+3+n%2))].join`
`
Darrylyeo
fuente
3

SOGL , 31 28 27 25 bytes

∫³2\@*O"²b“2⁵I%*r*;I»«nKp

Explicación:

∫                          iterate input times, pushing 1-indexed counter
 ³                         get 3 total copies of it on stack
  2\                       1 if divides by 2, else 0
    @*                     get that many spaces
      O                    output in a new line
       "²b“                push 1122
           2⁵I%*           multiply 1122 by 2%(iteration+1)
                r          convert to string
                 *         multiply by iteration
                  ;I»«     get one iteration variable ontop of stack
                      n    increase, floor divide by 2, multiply by 2 (gets the amount of bricks in a line)
                       Kp  split that multiplied string in pieces of that length

utilizando esta técnica
Ejemplo de salida para 9:

00
 22
2244
 2244
224422
 224422
22442244
 22442244
2244224422

no competidora, 22 bytes

∫³2\@*O"²b“2⁵I%*;I»«mp

El comando mha sido documentado en la primera confirmación SOGL , simplemente no implementado.

dzaima
fuente
3

05AB1E , 22 21 20 18 17 bytes

Utiliza el hecho interesante de que 4^(N+2)/5 = [3,12,51,204,...] = b[11,1100,110011,11001100,...]

F4NÌm5÷bDðì}r·IF,

Pruébalo en línea!

Explicación

F                     # for N in 0...input-1 do
 4                    # push 4
  NÌ                  # push N+2
    m                 # push 4^(N+2)
     5÷               # integer division by 5
       b              # convert to binary
        D             # duplicate
         ðì           # prepend a space to the copy
           }          # end loop
            r         # reverse stack
             ·        # multiply top of stack by 2
              IF      # input times do
                ,     # print with newline
Emigna
fuente
Lo siento, mejoré mi respuesta, ¡buen método!
Jonathan Allan
@ JonathanAllan: Por supuesto que sí;) ¡Gracias! Muy buena idea de manejar la sangría con rotaciones mod2 en su respuesta.
Emigna
2

PHP, 61 59

aa<?for(;++$i<$argn;)echo"
",str_pad(" "[~$i&1],2+$i,bbcc);

funciona más o menos como las versiones de Python, pero usa los tres colores si es posible. No hay una nueva línea al final.

-2 bytes by @user63956. Thanks !
Christoph
fuente
1
Puede guardar dos bytes con aa<?for....
user63956
1

Pyth , 29 bytes

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

¡Pruébelo en línea!

Explicaciones

VQI!%hN2pd)Vh/N2p*2@G%+NH3)pb

VQ                               For N in range(0, input)
  I!%hN2pd)                      If N is odd, print a leading space
           Vh/N2          )      For H in range(0, N / 2 + 1)
                   @G%+NH3       Select the letter at position (N + H) % 3 in the alphabet
                 *2              Then make it a two letters string ("aa" or "bb" or "cc")
                p                Print it
                           pb    End the line by printing a new line

Estoy seguro de que hay muchas maneras de acortar ese código, pero en este momento estoy muy cansado ... Lo intentaré más tarde.

Jim
fuente
0

Lote, 125 bytes

@set s=█
@for /l %%i in (2,1,%1)do @call:c
:c
@set s= %s:█= %
@set s=%s:▓=█%
@set s=%s:░=▓%
@set s=%s:  =░░%
@echo %s%

Nota: guarde esto en CP437 o CP850 o algo así. Funciona girando los colores cada vez. Como no puedo mapear sobre la cadena para realizar la rotación, uso cuatro reemplazos, usando espacios como una etapa temporal. Esto también me permite prefijar un espacio en cada línea, de modo que dos espacios se conviertan en un nuevo bloque. Salida de muestra:

░░
 ▓▓
░░██
 ▓▓░░
░░██▓▓
Neil
fuente