Al crecer, mi primer sistema de consola fue un Atari 2600 y siempre me encantarán algunos de esos juegos que tanto disfruté cuando era niño. Muchos de los gráficos siguen siendo memorables, quizás incluso icónicos.
Resulta que estos sprites son mapas de bits muy simplistas, de 8 píxeles de ancho con altura variable, donde la representación binaria es la disposición de los píxeles.
Por ejemplo, los bytes hexadecimales 0x18, 0x24, 0x18 dibujarían un círculo burdo así:
0x18: 00011000
0x24: 00100100
0x18: 00011000
Como 8 píxeles de ancho crea gráficos bastante pequeños (incluso para los estándares Atari 2600) era común duplicar o cuadruplicar la altura, el ancho o ambos para crear una versión más grande (aunque más bloqueada y distorsionada) de la misma imagen. Comúnmente, también serían volteados vertical u horizontalmente para los sprites y campos de juego de los jugadores. El juego Combat es un buen ejemplo de esto.
El desafío es escribir código para mostrar estos sprites como "gráficos" en forma ASCII, incluida la capacidad de estirarlos o voltearlos verticalmente, horizontalmente o ambos. Esto debe ser en forma de programa completo o función invocable.
Entrada:
- Una matriz de bytes, cada uno representando los bits horizontales para esa línea.
- Un valor entero distinto de cero para cada dirección, horizontal y vertical que representa el factor de escala para esa dimensión.
- Un valor negativo indica que la dimensión también debe invertirse a lo largo de su eje.
Salida:
- Representación ASCII a STDOUT o una cadena separada por una nueva línea, utilizando un carácter de espacio para píxeles negros (0) y cualquier carácter imprimible que no sea espacio de su elección para píxeles blancos (1).
Datos de prueba:
bmp1 = [ 0x06, 0x0F, 0xF3, 0xFE, 0x0E, 0x04, 0x04, 0x1E, 0x3F, 0x7F, 0xE3, 0xC3, 0xC3, 0xC7, 0xFF, 0x3C, 0x08, 0x8F, 0xE1, 0x3F ]
bmp2 = [ 0x07, 0xFD, 0xA7 ]
bmp3 = [ 0x00, 0x8E, 0x84, 0xFF, 0xFF, 0x04, 0x0E, 0x00 ]
bmp4 = [ 0x00, 0xFC, 0xFC, 0x38, 0x3F, 0x38, 0xFC, 0xFC]
Nota: Las matrices de entrada de bytes del ejemplo anterior se proporcionan como hexadecimales. Si su plataforma no acepta literales hexadecimales para la representación de bytes, puede convertirlos a un literal nativo equivalente a bytes.
Salida de ejemplo:
f( bmp1, 1, 1 ) =>
--------
XX
XXXX
XXXX XX
XXXXXXX
XXX
X
X
XXXX
XXXXXX
XXXXXXX
XXX XX
XX XX
XX XX
XX XXX
XXXXXXXX
XXXX
X
X XXXX
XXX X
XXXXXX
--------
f( bmp1, -2, 1 ) =>
----------------
XXXX
XXXXXXXX
XXXX XXXXXXXX
XXXXXXXXXXXXXX
XXXXXX
XX
XX
XXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXX
XXXX XXXXXX
XXXX XXXX
XXXX XXXX
XXXXXX XXXX
XXXXXXXXXXXXXXXX
XXXXXXXX
XX
XXXXXXXX XX
XX XXXXXX
XXXXXXXXXXXX
----------------
f( bmp2, 1, 2 ) =>
--------
XXX
XXX
XXXXXX X
XXXXXX X
X X XXX
X X XXX
--------
f( bmp2, 2, 1 ) =>
----------------
XXXXXX
XXXXXXXXXXXX XX
XX XX XXXXXX
----------------
f( bmp2, -2, -2 ) =>
----------------
XXXXXX XX XX
XXXXXX XX XX
XX XXXXXXXXXXXX
XX XXXXXXXXXXXX
XXXXXX
XXXXXX
----------------
f( bmp3, 1, -1 ) =>
--------
XXX
X
XXXXXXXX
XXXXXXXX
X X
X XXX
--------
f( bmp3, 3, 3 ) =>
------------------------
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXXXXXXXX
XXX XXX
XXX XXX
XXX XXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXX
XXX
XXX
XXXXXXXXX
XXXXXXXXX
XXXXXXXXX
------------------------
f( bmp4, -1, -1 ) =>
--------
XXXXXX
XXXXXX
XXX
XXXXXX
XXX
XXXXXX
XXXXXX
--------
f( bmp4, 4, 2 ) =>
--------------------------------
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX
--------------------------------
Nota: las líneas horizontales arriba y abajo deben mostrar el comienzo y el final de la salida. No se requieren en la salida, sin embargo, se requieren líneas vacías (representadas por todos los ceros / espacios) al principio y / o al final, como se muestra.
Nota 2: estos mapas de bits de prueba se inspiraron y se volvieron a dibujar / codificar en base a capturas de pantalla del juego etiquetadas como "uso justo" en Wikipedia.
Criterios ganadores
- Este es el código de golf , por lo que gana el código más corto en bytes por idioma.
- Las lagunas estándar están prohibidas.
Respuestas:
Python 2 , 117 bytes
Pruébalo en línea!
fuente
05AB1E ,
2726 bytesToma la entrada como una lista de cadenas binarias de 8 bits y las salidas con un carácter
1
no espacial.-1 byte gracias a @MagicOctopusUrn .
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
0‹i
...0‹
hecho ... Tenemos un byte para>=0
, que esd
. Pero también deberíamos tener un 1 byter para verificar la imo negativa. Ahora solo uso0‹
od_
.„íR³²‚0‹Ï.V
(código completoεε²Ä×}J³Äи0ð:}„íR³²‚0‹Ï.V˜»
) que no es una mejora, pero elimina uno de esos controles negativos.εS²Ä×J³Äи²0‹ií]³0‹iR}˜0ð:»
guarda un byte. Si puede tomar una matriz 2D, puede eliminarlaS
por completo por 25 bytes.S²Ä×
lugar deε²Ä×}
. ¡Gracias! Hmm, si se nos permite tomar las entradas binarias como una lista de 0s y 1s, se podría guardar un byte adicional omitiendo elS
. Le preguntará a OP si esto está permitido. Me gusta tu„íR³²‚0‹Ï.V
en tu otro comentario también. :)MATL ,
2419 bytesLas entradas son una matriz de números decimales, escala horizontal, escala vertical.
Pruébalo en línea!
Explicación
fuente
Dyalog APL,
464233 bytesPruébalo en línea!
-9 gracias a ngn!
fuente
{' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⍺,⊂⍉⍵⊤⍨8/2]}
dfn -> programa:' #'[⊃{⌽⍣(0>⍺)⊢(|⍺)/⍉⍵}/⎕,⊂⍉⎕⊤⍨8/2]
' #'[⍉⊃{⊖⍣(0>⍺)⍉⍵/⍨|⍺}/⎕,⊂⎕⊤⍨8/2]
. por cierto, la salida para la segunda prueba parece invertida en su solución originalPrólogo (SWI) , 252 bytes
Pruébalo en línea!
Explicación
fuente
Carbón , 28 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Recorrer la lista de bytes.
Mapa sobre el factor de escala vertical, multiplicando así las líneas de salida.
Convierta la entrada a la base 2, inviértala, asigne los dígitos al espacio y
X
luego multiplique cada carácter por el factor de escala horizontal.Si el factor de escala horizontal fue positivo, reflexione para obtener la imagen de la forma correcta nuevamente.
Refleje verticalmente si el factor de escala vertical fue negativo.
fuente
F
(For
) en lugar de¿
(If
) para las comprobaciones?else
está implícito, por lo que el único momento que puedo usarif
es si es la última declaración en el bloque.If
aquí sería en realidad unIf ... Else If ...
flojo en lugar de dosIf
. Hmm, es bueno saberlo.C (clang) , 120 bytes
Pruébalo en línea!
fuente
Lisp común , 157 bytes
Pruébalo en línea!
Explicación
fuente
Tcl , 192 bytes
Pruébalo en línea!
fuente
Código de máquina 8088, IBM PC DOS,
7771 bytesMontado:
Listado:
Esto resultó ser más deslumbrante en ASM de lo que originalmente pensé. Múltiples bucles concurrentes y muchas ramificaciones if / else ciertamente pueden causar dolores de cabeza.
Esto se implementa como un MACRO ya que permite el paso de parámetros similares a funciones para pruebas.
Salida
Aquí hay un programa de prueba para DOS que solicita el factor de escala X e Y y se dibuja en la pantalla. Tenga en cuenta que escalar demasiado el dragón se desplazará más allá de la parte superior, ya que la ventana predeterminada de DOS solo tiene 24 filas.
Y aquí está nuestro pequeño dragón (pato):
Pruébalo en línea!
Puede probar en una máquina virtual DOS con DOSBox o VirtualConsoles.com con los siguientes pasos:
PLANE
,KEY
,TANK
oDRAGON
.fuente
Perl 5, 105 bytes
TIO
Si la entrada debe ser hexadecimal
126 bytes
fuente
Jalea , 21 bytes
Pruébalo en línea!
Asume que hay como máximo un argumento de línea de comandos.
fuente
APL (Dyalog Extended) , SBCS de 23 bytes
método de dzaima
⎕IO←0
Pruébalo en línea!
{
…}/
Reduzca de derecha a izquierda utilizando la siguiente lambda anónima:|⍺
La magnitud del argumento izquierdo (el factor de escala)⍵/⍨
usar eso para replicar el argumento correcto horizontalmente⍉
transponer⊖⍣(
...)
voltear si:>⍺
el factor de escala es menor que cero⊃
revelar (ya que la reducción incluida para reducir el rango del tensor de 1 a 0)' x'⊇⍨
seleccionar elementos de la cadena "x" usando esa matrizfuente
Ruby , 89 bytes
Pruébalo en línea!
fuente
T-SQL, 216 bytes
Antes de ejecutar este MS-SQL Studio Management, presione CRTL-t para mostrar los datos como texto. La altura no se puede ajustar para exceder el número de elementos en la entrada.
Debido a la horrible implementación de STRING_AGG , la variable de altura solo funcionará en MSSM. MS debería haber hecho un tercer parámetro opcional para incluir el orden de los elementos que se concatenan.
La versión en línea solo puede soportar el ajuste del ancho. La altura dará como resultado un resultado funky con múltiples formas de apilamiento.
Este script no mostrará las formas correctas en la versión en línea, así que hice algunos ajustes menores para compensar. Pruébalo en línea
fuente