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
1no 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 eliminarlaSpor 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‹Ï.Ven 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
Xluego 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?elseestá implícito, por lo que el único momento que puedo usarifes si es la última declaración en el bloque.Ifaquí 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,TANKoDRAGON.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←0Prué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