pb , 240 bytes
<[8]^w[Y!14]{w[X!24]{>[8]b[124]^b[124]v}vw[X!-8]{b[45]<}vv}>[12]^[12]b[49]>[12]w[T!8]{<[4]b[T+50]^<w[X%8!6]{b[65+T*3+X%8%3]>}>[10]vw[B!124]{<[24]vvv}t[T+1]}<[4]b[42]>[8]b[48]>[8]b[35]^[4]>w[B!0]{b[B+2]<}b[87]w[X!2]{<[5]w[B!0]{b[B+1]<}}b[80]
(Este programa solicitará la entrada en la versión actual de pbi, porque va a Y = -1 y la B
variable intenta actualizarse. Incluso si ingresa input, nada se romperá. Es molesto pero es mejor que la versión anterior que solicitó información sin importar qué.)
pb es un lenguaje que trata sobre tratar el terminal como un lienzo 2D. Para generar, debe mover el "pincel" (un punto representado por los valores actuales de las variables X e Y) a donde desea que vaya ese carácter y colocarlo allí. Es engorroso para cosas como imprimir una palabra, pero para el arte a menudo es conveniente.
Este programa en realidad no dibuja exactamente lo que especifica la pregunta. (¡Espera, no me desestimes todavía! ¡Déjame explicarte!)
Dibujar cajas con bucles es bastante fácil, pero hay una trampa. Si repites la siguiente forma:
--------
|
|
Obtendrá cajas, pero las correctas e inferiores estarán abiertas. Puede dibujar manualmente los lados adicionales, pero eso cuesta bytes. Para evitar esto, mi programa realmente dibuja esto, con los bordes abiertos a la izquierda y arriba:
| | | |
| | | |
--------------------------------
| | ABC | DEF |
| 1 | 2 | 3 |
--------------------------------
| GHI | JKL | MNO |
| 4 | 5 | 6 |
--------------------------------
| PQRS | TUV | WXYZ |
| 7 | 8 | 9 |
--------------------------------
| | | |
| * | 0 | # |
--------------------------------
Pero monorraíl! ¡Eso no es lo que dice la especificación! ¡No puedes dibujar otra cosa porque es más fácil y te da la gana! Además, aunque tengo tu atención, eres muy inteligente y linda.
Shh, shh, está bien. pb le permite "escribir" en un punto del lienzo con uno o más valores negativos en sus coordenadas. El valor se almacena mientras se ejecuta el programa, pero solo los puntos donde X e Y son ambos> = 0 se escriben realmente en la pantalla. Este programa coloca el pincel de modo que las áreas que están teñidas en esta imagen tengan una X o Y negativa:
Aunque las líneas adicionales se "dibujan", nunca se imprimen.
Después de recorrer y crear la cuadrícula, este programa llena los nueve cuadros superiores. El primero está codificado, se escribe un 1 y el programa continúa. Los otros ocho se generan mediante programación. Ignorando el código para pasar al siguiente cuadro, notando cuando la fila está vacía, etc. (suponga que el pincel siempre comienza en la fila inferior del cuadro y en la columna central), esto es lo que se ejecuta ocho veces:
b[T+50]
^<w[X%8!6]{b[65+T*3+X%8%3]>}
t[T+1]
Incluso sabiendo que ese b
es el comando para escribir un personaje, ^v<>
mueve el pincel y w[a!b]{}
ejecuta el código entre llaves hasta que a != b
sea difícil de seguir. Lo primero que debe tener en cuenta es que no puede definir variables en pb. Hay seis en cada programa y tienes que aprender a vivir con ellos. En segundo lugar, T
es la única variable que realmente puede usar de la forma en que está acostumbrado a usar variables; asignar un valor y luego leerlo más tarde. Cualquier otra variable no se puede establecer y solo le dice algo sobre el punto en el lienzo en el que se encuentra o solo se puede establecer indirectamente y con efectos secundarios ( ^v<>
cambiar X
y Y
, que también cambia la ubicación del pincel. c
Establece P
en(P+1)%8
, que también cambia el color de salida). Mantener un contador para saber qué número debe escribirse y qué letras es simplemente imposible. En cambio, este código solo realiza un seguimiento del número y calcula las letras basadas en él. Así es cómo:
b[T+50] # We start printing at box 2 with T==0, 0+50=='2'
^< # Go up and to the left of the number
w[X%8!6]{ # Take the X coordinate mod 8 so it's like we're in
# the leftmost box. Until hitting the sixth cell:
b[ # Write this character:
65 # 'A'
+ T * 3 # Number of current box - 2 (letters start at
# 2) * 3 (3 letters per box)
+ X % 8 % 3 # X % 8 makes every box behave like it's on the
# left, % 3 puts 0 at the point where the first
# letter goes, then 1, then 2. This is how each
# letter is made different in a box.
]
> # Move to the right
}
t[T+1] # Box is done, increase counter
Esto es imperfecto, ya que solo se colocan 3 letras en los cuadros 7 y 9. Entonces, después de llenar la fila inferior (codificación simple), cada letra en el cuadro 9 se incrementa en 2 y la W se coloca manualmente. Del mismo modo, cada letra en las casillas 7 y 8 se incrementa en 1 y la P se coloca manualmente.
Sin golf:
<[8]^ # Go to (-8, -1)
w[Y!14]{ # While the brush is not on Y=14:
w[X!24]{ # While the brush is not on X=24:
>[8] # Go right 8
b[124]^b[124]v # Draw a pipe at the current location and above it
}
vw[X!-8]{b[45]<} # Go down and draw hyphens all the way until X=-8
vv # Go down by 2 to start drawing next row
}
>[12]^[12]b[49] # Write a 1 in the first box
>[12] # Go to the bottom pipe on the right of box 2
w[T!8]{ # While T is not 8:
<[4] # Go to center cell of the box
b[T+50] # Write the number that belongs there
^<w[X%8!6]{b[65+T*3+X%8%3]>} # Write the letters
>[10]v # Go to the next box
w[B!124]{ # If the next box isn't there:
<[24]vvv # Go down a row
}
t[T+1] # Increase counter
}
<[4]b[42]>[8]b[48]>[8]b[35] # Put the asterisk, 0 and hash in their boxes
^[4]>w[B!0]{b[B+2]<} # Increase all letters in the 9th box by 2
b[87] # Put a W in the 9th box
w[X!2]{<[5]w[B!0]{b[B+1]<}} # Increase all letters in the 7th/8th box by 1
b[80] # Put a P in the 7th box