Introducción
El Atari ST era una computadora personal bastante popular desde mediados de los 80 hasta principios de los 90, impulsada por un microprocesador Motorola 68000. En esta máquina, el comportamiento predeterminado del sistema operativo para las excepciones de CPU no capturadas era mostrar una fila de bombas en la pantalla, como se muestra en la siguiente imagen:
Fuente: https://commons.wikimedia.org/wiki/File:Row_of_bombs.png
NB: Dependiendo de la versión del sistema operativo, los gráficos de la bomba pueden variar ligeramente. Pero tomemos este como referencia.
La cantidad de bombas depende del vector de excepción, siendo las más comunes:
- ($ 008) Error de autobús: 2 bombas
- ($ 00c) Error de dirección: 3 bombas
- ($ 010) Instrucción ilegal: 4 bombas
Gol
Su objetivo es escribir un programa o función que imprima o genere un arte ASCII de tales bombas Atari ST.
Entrada
Un número entero que representa el número de bombas para mostrar. Su código debe admitir los valores más comunes: 2, 3 y 4. Está bien admitir menos y / o más bombas, pero no es obligatorio ni está sujeto a una bonificación.
Salida
La bomba original consiste en un mosaico de 16x16 píxeles, representado aquí tanto en ASCII como en binario:
....##.......... 0000110000000000
.#.#..#......... 0101001000000000
.......#........ 0000000100000000
#..#....#....... 1001000010000000
..#...#####..... 0010001111100000
......#####..... 0000001111100000
....#########... 0000111111111000
...###########.. 0001111111111100
...###########.. 0001111111111100
..#############. 0011111111111110
..########.####. 0011111111011110
...#######.###.. 0001111111011100
...######.####.. 0001111110111100
....#########... 0000111111111000
.....#######.... 0000011111110000
.......###...... 0000000111000000
En este desafío, cada bomba ASCII debe estirarse al doble de su ancho original para una mejor representación. Por lo tanto, constará de 16 filas de 32 caracteres, que se utilizarán ##
para píxeles 'ACTIVADOS' y dos espacios para píxeles 'DESACTIVADOS'. Todas las fichas de bombas deben colocarse una al lado de la otra. Los espacios principales están prohibidos. Los espacios finales también están prohibidos, excepto los que en realidad son parte de la loseta de la bomba (es decir, las columnas 31 y 32) que deben estar presentes. Puede incluir no más de un salto de línea inicial y no más de un salto de línea final.
Ejemplo
A continuación se muestra la salida de referencia para dos bombas, donde los saltos de línea obligatorios se marcan como \n
y los saltos de línea adicionales tolerados se marcan como (\n)
:
(\n)
#### #### \n
## ## ## ## ## ## \n
## ## \n
## ## ## ## ## ## \n
## ########## ## ########## \n
########## ########## \n
################## ################## \n
###################### ###################### \n
###################### ###################### \n
########################## ########################## \n
################ ######## ################ ######## \n
############## ###### ############## ###### \n
############ ######## ############ ######## \n
################## ################## \n
############## ############## \n
###### ###### (\n)
(Por supuesto, otros formatos de salto de línea como \r
o \r\n
pueden usarse igual de bien).
Reglas
Este es el código de golf, por lo que gana la respuesta más corta en bytes. Las lagunas estándar están prohibidas.
Respuestas:
Jalea ,
4344 bytes+1 byte: olvidé duplicar los caracteres (¡eso no lo notó nadie!)
TryItOnline
¿Cómo?
La preparación consistió en comprimir los datos como una codificación de longitud de ejecución de la imagen original:
1
s (espacio) o0
s (hash) en la imagen, ignorando las nuevas líneas: se obtiene una lista[4,2,11,1,1,...]
:;[0,15]
;v
, con el índicei
en reversa y suma16**i*v
=19468823747267181273462257760938030726282593096816512166437
);[5,119,249,42,...]
:;¥vẏ)X;ndĊɓ¡ẹ3ċi}Ịɲ¡P
Ahora el código evalúa este número, asigna los
1
sys0
al espacio y los caracteres hash *, duplica cada uno, se divide en líneas y repite cada uno el número apropiado de veces.* En realidad, la implementación se realiza en el módulo 2 para guardar bytes, por lo que los espacios son impares y los hash son pares:
fuente
05AB1E ,
57555350 bytesUtiliza la codificación CP-1252 .
Pruébalo en línea!
Explicación
Como la imagen de salida solo consta de 2 caracteres, podemos representarla como un número binario.
Podemos ignorar las nuevas líneas ya que cada línea tiene la misma longitud.
Podemos ignorar el último carácter de cada fila, ya que es el mismo para todas las filas.
Utilizamos la imagen más delgada, ya que ocupa menos espacio y podemos duplicar fácilmente cada carácter más adelante.
Usando 1 para representar el espacio y 0 para representar # obtenemos el número binario:
111100111111111101011011111111111111101111111011011110111111110111000001111111111000001111111100000000011111000000000001111000000000001110000000000000110000000010000111000000010001111000000100001111100000000011111110000000111111111100011111
Luego convertimos esto a base-10 y luego lo comprimimos a base 214, la base máxima en 05AB1E. El resultado de esto es:
La carne del programa consiste en lo siguiente:
fuente
Pyth,
575654535150 bytesEl código contiene caracteres no imprimibles, así que aquí hay un
xxd
hexdump reversible .Pruébalo en línea.
fuente
JavaScript (ES6),
159154140136 bytesAhorré muchos bytes gracias a @Hedi y @Arnauld
Eso es 104 caracteres, pero (lamentablemente) 136 bytes UTF-8. La cadena se generó con este fragmento:
Mostrar fragmento de código
Usar en
.replace
lugar de[...string].map
es igualmente largo:Cómo funciona
Como cada fila de datos sin procesar puede representarse como un número de 16 bits, podemos almacenar el archivo completo en una cadena de 16 caracteres. El algoritmo de compresión toma cada fila binaria, la voltea y la invierte (dado que cada fila en el original termina en 0 , cada fila en la versión modificada ahora comienza con un 1 ), luego la convierte en un carácter y concatena los caracteres resultantes .
Para descomprimirlo, necesitamos extraer el código de char y convertir su representación binaria en una cadena de hashes y espacios. Esto se puede hacer con una función recursiva, así:
f
repetidamente toma el último bit deq
, seleccionando dos espacios si es 1 o dos hashes si es 0, luego concatena eso con el resultado de ejecutarsef
en el resto deq
. Esto se ejecutax.charCodeAt()
, convirtiendo el código char en la cadena correcta de espacios y hashes.(Hubo mucho más drama aquí antes, pero la técnica de ahorro de 4 bytes borró todo eso).
Después de eso, podemos repetir los
n
tiempos de la cadena y agregar una nueva línea. Este es el método de descompresión más corto que he encontrado, pero no dude en sugerir cualquier método posiblemente más corto.Otros intentos de comprimir la cadena:
El primero de ellos es 153 bytes, por lo que ninguno de ellos se acerca a 136 ...
fuente
+x?'##':' '
lugar de" #"[x].repeat(2)
x.charCodeAt()
lugar de convertirlos en binarios? (Creo que eso ahorraría unos 8 bytes.)Archivo .COM de MS-DOS, 84 bytes
OKAY. Solo por diversión porque no puedo superar los 50 bytes ...
Probado en DOSbox y en MS-DOS 6.22 en una máquina virtual.
En DOSbox, el programa funciona bien, sin embargo, en MS-DOS real, la salida no se mostrará correctamente porque DOS requiere CR-LF en lugar de LF al final de la línea.
(Sin embargo, la salida es correcta).
Una variante de 88 bytes usaría CR-LF al final de la línea.
Aquí está el archivo:
El código del ensamblador (en la sintaxis de AT&T) se ve así:
--- Editar ---
Olvidé mencionar: El programa debe iniciarse con la siguiente línea de comando:
Nombre del archivo COM + exactamente un carácter de espacio + Número de bombas (1-9)
fuente
objdump -dw
La salida es una buena manera de mostrar el binario sin formato, ya que puede ver qué bytes son qué instrucción. Lo hice para las respuestas de gcd y adler32 . (Además de incluir el código fuente comentado para que las personas se prueben a sí mismas)Python,
223179 bytesSegundo enfoque:
Pruébalo en repl.it!
En lugar de crear una lista de cadenas sobre la marcha, hay una cadena hexadecimal codificada que se indexa y se convierte en binario; entonces cada dígito binario se convierte en
' '
o'#'
, que se duplica y se une ... etc.Primer enfoque:
Pruébalo en repl.it!
Contiene una lista codificada de las cadenas de cada línea (sin incluir espacios finales) creadas por duplicación,
' '
o'##'
varias veces. Para cada una de estas cadenas, se rellenan con espacios de hasta 32 caracteres de longitud,n
tiempos duplicados , luego se unen con líneas nuevas.fuente
'\n'
. Por lo tanto,lambda n:print(*(''.join(2*' #'[int(d)]for d in bin(int('0c0052000100908023e003e00ff81ffc1ffc3ffe3fde1fdc1fbc0ff807f001c0'[i:i+4],16))[2:].zfill(16))*n for i in range(0,64,4)))
. Además, no tiene que contar los bytes necesarios para asignar un nombre a la lambda. Entonces su puntaje puede ser 176.C,
250240208188 bytesCambiar a usar una función.
Prueba así.
main(c,v)char**v; { f(atoi(v[1])); }
fuente
0x
./// ,
539532 + no. de bytes de bombasLa primera /// respuesta, mostrando 4 bombas. Los últimos cuatro 1 pueden reemplazarse con cualquier representación unaria del número de bombas que desea imprimir (11 para 2, 111 para 3)
Pruébalo en línea!
Si la entrada debe ser decimal, lo siguiente tiene
555548 bytes (donde el último dígito se puede cambiar a 1, 2, 3 o 4):Pruébalo en línea!
Las partes más importantes del código son que:
| significa //
ABCDEFGHIJKLMNOP significa cada línea de la bomba respectivamente
S significa 2 espacios
s significa 4 espacios
* significa 6 espacios
q significa 8 espacios
T
significa #### (4)
^ significa ##### # (6)
r significa ######## (8)
y significa ################ (16)
La mayor parte del código se asegura de que las bombas estén impresas lado a lado, no uno encima del otro.
fuente
CJam , 66 bytes
Pruébalo en línea! (tenga en cuenta que hay algunos caracteres no imprimibles en el código).
La bomba está codificada como un número en binario usando 1 para espacios (el espacio inicial como 1 asegura que no tengamos que rellenar las representaciones binarias), transpuesto y luego convertido a cadena en base-136 (que produjo la cadena más corta sin caracteres anchos). Estos pasos se pueden jugar aquí .
Esta respuesta invierte la codificación, el truco principal es repetir la bomba antes de transponer, concatenando efectivamente cada línea de la bomba a la vez. Los caracteres en cada línea se pueden duplicar con nuevas líneas insertadas para la salida final.
fuente
PHP,
138104+ 32 = 136 bytesNunca había pensado que
file
era seguro binario. Solo desearía haber encontrado una forma más interesante de almacenar los datos; pero nada que probé venció al binario en bruto.0
con 2 espacios,1
con##
,repetir
$argv[1]
tiempos, imprimir resultado + nueva líneacorre con
-r
datos binarios en el archivo
b
:código para generar el archivo:
fuente
\n
.MATL ,
6463605958 bytesPruébalo en línea!
Explicación
El código utiliza una versión precomprimida de la matriz binaria 16 × 16. La precompresión (que no forma parte del programa) utilizó dos pasos:
La cuerda comprimida
se descomprime de la base 94 a la base 16:
El vector obtenido de longitudes de carrera más 1 se multiplica por 2:
para realizar el estiramiento horizontal.
El vector de longitudes de carrera contiene 49 valores. Los números originales que se repetirán con esas longitudes deben ser
[0 1 0 1 ... 0]
(49 entradas). Pero en lugar de eso, es más corto usar el vector[1 2 ... 49]
, que será igualmente válido gracias a la indexación modular. Entonces la decodificación de longitud de ejecución esEl vector generado containis las carreras de
1
,2
, ...49
, para un total de 512 entradas. Esto se reforma en una matriz de 16 × 32:y usado como índices modulares en la cadena
' #'
para producir una sola bomba:Finalmente, la repetición horizontal por un factor dado por la entrada produce el resultado deseado:
fuente
Python 2: 143 bytes
Esta en ideone
(Me di cuenta de que la codificación directa de la bomba original en la base 36 hacía un código más corto en Python).
La cadena se formó tratando los espacios como 1s y los hashes como 0s, y luego convirtiéndolos en la base 36. El programa luego vuelve a convertirlos en binarios y cortes en longitudes de 16 (con un desplazamiento de 2 para el '0b' en la parte delantera de Python) cadena binaria), se convierte en espacios dobles y hashes dobles, los une, repite los
n
tiempos de cadena e imprime.Anterior: Python 2,
169 166163 bytesEsta en ideone
Casi un puerto de mi respuesta Jelly .
fuente
Python 2.7,
144141 bytesLa bomba está escrita en binario con 1 para el espacio, el 1 inicial elimina la necesidad de rellenar representaciones binarias. La bomba se transpone (al igual que en mi respuesta de CJam ) y se almacena en la base 36.
El programa decodifica la bomba en binario e itera bits en un paso de 16 siguiendo efectivamente la transposición (lo que ahorra bytes sobre el corte de una línea dada). La línea resultante se concatena, los bits se reemplazan por doblado
o
#
, y se unen en una cadena singe.fuente
O
por alguna razón ...C (gcc) ,
216204183165134bytesPruébalo en línea!
Escrito como un programa independiente (
201183151bytes)Pruébalo en línea!
Esto falla si no se proporciona un parámetro de línea de comando.
fuente
Lote, 415 bytes.
Nota: la línea
set s=
termina en 5 espacios. Acepta el recuento como un parámetro de línea de comandos. Simplemente recorre cada línea de la bomba (comprimida muy ligeramente al eliminar series de 5 caracteres idénticos) y luego repite la bomba tantas veces como desee antes de finalmente duplicar cada personaje.fuente
Python 2,
206205203199191188186184160 bytesBusqué en Hex la lista de números, pero no pareció ahorrar lo suficiente como para que valiera la pena. Esperaba poder descifrar el código pero parece que he llegado tan lejos como puedo con este enfoque. Cualquier pista adicional recibida con gratitud.
EDITAR
-1 cambiando
e==1
ae>0
. Siempre me olvido de eso.-2 ignorando la longitud de la cadena binaria, anteponiendo 7 0 y tomando solo los últimos 16 elementos. Funciona ya que nunca hay más de 7 ceros a la izquierda.
-4 porque ahora que he perdido la segunda referencia a la variable b, puedo usarla
bin(y)[2:]
directamente en la función de mapa llevándola debajo del magic 200 :-)-8 usando la asignación de corte en la segunda lista. Aprendí algo nuevo esta noche.
-3 con gracias a @Jonathan
-2 usando en
c=d=([0]*7+map(int,bin(y)[2:]))[-16:]
lugar de tenerc=d;
-2 nuevamente gracias a @Jonathan
-24 gracias a @Linus
Salida
fuente
" #"[e>0]*2
funcionará(...)
pueden ir también (RE: según mi comentario anterior).for y in ...:print"".join(" #"[e>0]*2for e in(([0]*7+map(int,bin(y)[2:]))[-16:]))*z
RProgN ,
210193 BytesGuarde algunos bytes cambiando 0 = '' 1 = '##' a 1 = '' 0 = '', esto significa que no necesito agregar los ceros adicionales. Además, esto significa que ahora la cadena B64 que solía decir "MAFIA" no lo hace, esto es triste.
Explicación
Bastante largo, la expansión, impresión y tal de la cadena comprimida es de 105 de los bytes. Podría ser un poco más golfable, pero al menos funciona.
La entrada está implícitamente en la pila, la pila se imprime implícitamente.
Salida
¡Intentalo!
fuente
PHP,
144140139138136 bytesNota: utiliza la codificación de Windows-1252
Corre así:
O utilizando la codificación IBM-850 (135 bytes y un resultado más bonito):
Explicación
Esto no hace nada binario y no requiere un archivo externo.
Cada número de 16 bits se invierte, luego se codifica como un número base 36, se rellena con un encabezado
0
si es necesario, por lo que cada 16 bits da como resultado 3 bytes. Concatenando esos resultados en01c02203k07d1j81j46b4cmwcmwpa4ohobugc8o6b434w0ow
. El código invierte el proceso para que las bombas se impriman correctamenteN
veces.Ajustes
$j
a cero en los límites de línea con%=
. Esto elimina los paréntesis$argn
fuente
GCC C 129 bytes
ISO8859 / ASCII
En una linea:
Corre con:
Fuente de compilación como ISO8859-x (ASCII).
NB óÿÿþÿoÜüðààÀÀ! ÀCàCðøþ? debe contener los Códigos ASCII invisibles, pero se ha roto debido a la forma en que StackExchange presenta su contenido. Consulte el enlace de ideaone para una codificación de prueba adecuada. Alternativamente, la Cadena ASCII original se encuentra en: https://github.com/claydonkey/AtariBombs/blob/master/ISO8859_REPR2.txt
Explicación
Primero, una conversión de la representación hexadecimal de las bombas [f3 ff ad ff fe ff 6f 7f dc 1f fc 1f f0 07 e0 03 e0 03 c0 01 c0 21 c0 43 e0 43 f0 07 f8 0f fe 3f] a UTF-8 (en el En la versión UTF-8, el compilador almacena la cadena como Wide Char Array: 2 o 4 bytes para cada carácter en tiempo de ejecución, pero esto es académico). Mientras que los caracteres UTF-8 se almacenarían como 2-4 bytes, estos valores están todos dentro de ISO-8859-1 (ASCII) y, por lo tanto, solo requieren 1 byte. También es seguro almacenarlo como ISO-8859-x (no hay valores 0x8_ o 0x9_). Por lo tanto, el texto consume 32 bytes en ISO-8859 y la rutina consume 135 bytes en total.
(NB los caracteres anchos se almacenan como un entero de 16 bits en Windows y 32 bits en Linux, pero de nuevo esto es irrelevante para la tarea en cuestión)
Advertencia: no todos los caracteres se pueden mostrar (los caracteres de control por debajo de 0x20). Sin embargo, todavía están presentes. La mayoría de las páginas web son utf-8 / 8859/1253 ( https://w3techs.com/technologies/overview/character_encoding/all ), así que creo que esto es legítimo
(cambiar todos los valores por debajo de 0x20 a ASCII imprimible debería solucionarlo).UTF-8
Aquí está la versión más cercana a la publicación original con fuente codificada UTF-8. Esto consume 173 bytes. La cadena en sí es de 50 bytes de la fuente. La rutina también es más larga ya que los bytes ASCII ahora se almacenan con 0 de relleno para los caracteres anchos de 16 bits / 32 bits y deben cambiarse en lugar de convertirse a uint16_t como se indicó anteriormente. He mantenido esto, ya que se puede verificar con ideone, que utiliza la codificación UTF-8.
Corre con:
Si puede establecer el valor implícito en un entero de 16 bits en su compilador, puede omitir la declaración de tipo wchar_t del Wide Char. Ideone no se queja, así que creo que es bueno ir.
Pruébalo en ideone
fuente
Haskell, 155 bytes
Como una función con tipo
Int -> String
:Imprimir a IO directamente costará 5 bytes (o 6 si preferimos regresar en
IO ()
lugar deIO [()]
):fuente
C, 175 bytes
concatena cada x consigo mismo y hace que p se desborde para terminar cada línea.
fuente
Java, 228 bytes
fuente
n->{String s="";for(int x,r=0;r<16*n;s+=(++r%n<1?"\n":""))for(x=16;x-->0;)s+=((new int[]{1536,10496,128,18496,4592,496,2044,4094,4094,8191,8175,4078,4062,2044,1016,224}[r/n])&(1<<x))<1?" ":"##";return s;}
( 205 bytes ) Además de usar un Java 8 lambda, he reducido más bytes cambiando: la posición dex=16
(y cambiadowhile
afor
); 2x==0
a<1
; regresar ens
lugar de imprimirlo (las importaciones también son parte del byte-count por cierto ...);--x>=0
ax-->0
. Aún así, gran respuesta, entonces +1!J, 89 bytes
Codifica la cadena como un número base-95, incrementa cada dígito en
32
, luego lo representa con una cadena ascii.Explicación
Esto se compone de dos partes principales. Está la construcción de la bomba y la repetición real. Vamos a referirnos por el momento a la bomba como
b
. Entonces, el código se ve así:Cuando se llama con entrada
k
, esto es equivalente a:b
es una bomba en caja, por lo quek#b
hacek
repeticionesb
, la;
aplana verticalmente y|:
transpone el resultado. (La bomba enb
sí está construida transpuesta).Ahora, aquí está la bomba:
La siguiente cadena es una cadena codificada en base 95 con un desplazamiento de
32
, de modo que todos los caracteres caen en el rango ASCII, y afortunadamente no hay'
s que necesiten escapar.3 u:
obtiene los códigos char de la cadena,32x-~
convierte cada número en unx
número tendido y lo resta32
;95#.
convierte a un número base 95 y lo2#.inv
convierte a una matriz de dígitos binarios. Agregué un encabezado1
al binario para que sea un número sólido, así que lo quito con}.
. Moldeo la matriz en una tabla de 16x16 y16 16$
luego la transpongo usando|:
. (Posible golf para más tarde: transponer la cadena codificada literal).2#
Duplica cada carácter a lo ancho. Nos queda una tabla de0
sy1
s.' #'{~
mapas0
s a' '
y1
a'#'
. Por lo tanto, nos quedamos con nuestra bomba.Caso de prueba
fuente
BaCon ,
229227195 bytesUna contribución en BASIC en aras de la nostalgia. La variable 'a' determina la cantidad de bombas.
Salida :
fuente
Haskell,
191181 bytesfuente
C (Atari TOS 2.06 US),
129124117113bytesEsto utiliza el mapa de bits de la bomba de la ROM de TOS, que es ligeramente diferente del de la pregunta. Para otras versiones de TOS, deberá ajustar la dirección señalada por
*a
. ¡Tenga en cuenta que algunas roms de emulador no incluyen el mapa de bits de la bomba!Si no proporciona un argumento de línea de comando, se pueden mostrar varias bombas de mapa de bits de alta resolución :-)
fuente
C ++ 11, 252 bytes
fuente
SmileBASIC, 127 bytes
(Captura de pantalla de la versión sin caracteres duplicados)
SB tiene una fuente cuadrada, por lo que duplicar los caracteres se ve mal (y no cabe en la pantalla)
Los caracteres no ASCII han sido reemplazados por
x
's.Valores hexadecimales:
0008,0002,0610,1F8A,3FC1,7FC1,7FF2,FFF4,FFF8,EFF0,73F0,7FC0,3FC0,1F80,0600
dado que SB guarda archivos en UTF-8, algunos de estos cuentan como 2 o 3 bytes.
fuente
FOR K=1TO N
conINPUT N
, creo que muestra el número de bombas que figuran en la entrada. Sin embargo, debo decir que a pesar de la fuente cuadrada, creo que los caracteres deben duplicarse para mantener la coherencia con los requisitos (para evitar una ventaja sobre otras respuestas). Podrías mantener la actual para una solución más atractiva, pero creo que aún debes agregar una solución correcta. Una vez que agregues eso, ¡votaré por el uso creativo de los caracteres UTF-8!Ruby 2.x (lambda) - 157 bytes
Probablemente se pueda jugar más, pero me gusta esta versión:
Idea similar a la versión de Python (s): romper la cadena de bombas hexadecimal codificado en secciones de 4 caracteres, convertir a binario, se traduce
1
a#
y0
a, el doble de todos los personajes, e imprimir la matriz resultante.
Tenga en cuenta que Put se utiliza para imprimir la matriz. Esto imprimirá la matriz una línea por elemento.
fuente
Excel VBA, 204 bytes
Función de ventana inmediata anónima VBE que toma la entrada del rango
[A1]
y las salidas al objeto ActiveSheetSalida
fuente