En 2014, el demoscener Jakub 'Ilmenit' Debski lanzó una demostración gráfica de procedimiento de 250 bytes (1) para el Atari XL llamada Mona . Está dibujando la siguiente imagen (2) :
Su tarea es generar exactamente la misma imagen, utilizando el idioma de su elección.
(1) Desglose: 136 bytes de datos + 114 bytes de código.
(2) La imagen original es de 128x96. La versión anterior se amplió a 256x192. Algunos píxeles difieren del original, pero este es el resultado esperado con el pseudocódigo descrito en este desafío.
¿Cómo?
Este es el código de golf . Aunque está autorizado a utilizar cualquier método, lo más probable es que se obtengan los mejores resultados utilizando el algoritmo original que se describe a continuación.
NB : Este párrafo no es una especificación sino más bien una descripción general. Consulte el pseudocódigo y la implementación de referencia para conocer los detalles del algoritmo.
La imagen está hecha de 64 pinceladas pseudoaleatorias ( vea este video ), recorriendo los siguientes colores (en formato hexadecimal RRGGBB):
COLOR = [ 0xFFE289, 0xE99E45, 0xA55A00, 0x000000 ]
El fondo se llena inicialmente con el 4to color (negro). Cada golpe es más corto que el anterior.
El generador pseudoaleatorio está utilizando un Registro de desplazamiento de retroalimentación lineal (LFSR) en un entero de 32 bits establecido inicialmente 0x7EC80000
y con XOR 0x04C11DB7
.
Cada trazo se inicializa con un valor de 16 bits que sobrescribe los bytes más bajos de la semilla:
BRUSH = [
0x030A, 0x37BE, 0x2F9B, 0x072B, 0x0E3C, 0xF59B, 0x8A91, 0x1B0B,
0x0EBD, 0x9378, 0xB83E, 0xB05A, 0x70B5, 0x0280, 0xD0B1, 0x9CD2,
0x2093, 0x209C, 0x3D11, 0x26D6, 0xDF19, 0x97F5, 0x90A3, 0xA347,
0x8AF7, 0x0859, 0x29AD, 0xA32C, 0x7DFC, 0x0D7D, 0xD57A, 0x3051,
0xD431, 0x542B, 0xB242, 0xB114, 0x8A96, 0x2914, 0xB0F1, 0x532C,
0x0413, 0x0A09, 0x3EBB, 0xE916, 0x1877, 0xB8E2, 0xAC72, 0x80C7,
0x5240, 0x8D3C, 0x3EAF, 0xAD63, 0x1E14, 0xB23D, 0x238F, 0xC07B,
0xAF9D, 0x312E, 0x96CE, 0x25A7, 0x9E37, 0x2C44, 0x2BB9, 0x2139
];
Estos valores también se utilizan para establecer la nueva posición (bx, by) del pincel al comienzo del trazo: bx viene dado por el byte menos significativo y by está dado por el byte más significativo.
La dirección del trazo viene dada por los bits 1 y 7 de la semilla. (Consulte la instrucción SWITCH en el pseudocódigo).
Pseudocódigo
A continuación se muestra el algoritmo de la pseudo-código, suponiendo arrays 0 indexados, donde AND
, OR
y XOR
las operaciones de medios a nivel de bit.
seed = 0x7EC80000
dir = 0x00
FOR part = 0 TO 63
word = BRUSH[part]
seed = (seed AND 0xFFFF0000) OR word
bx = word AND 0xFF
by = (word >> 8) AND 0xFF
FOR len = 0 TO (64 - part) * 32 - 1
carry = seed AND 0x80000000
seed = (seed << 1) AND 0xFFFFFFFF
IF carry
seed = seed XOR 0x04C11DB7
dir = seed AND 0xFF
ENDIF
SWITCH dir AND 0x82
CASE 0x00:
by = (by + 1) AND 0x7F
ENDCASE
CASE 0x02:
bx = (bx + 1) AND 0x7F
ENDCASE
CASE 0x80:
by = (by - 1) AND 0x7F
ENDCASE
CASE 0x82:
bx = (bx - 1) AND 0x7F
ENDCASE
ENDSWITCH
drawPixel(bx, by, COLOR[part AND 3])
ENDFOR
ENDFOR
Implementación de referencia
A continuación se muestra una implementación de referencia no protegida en JavaScript.
También puedes ver una versión animada aquí .
Aclaraciones y reglas
- La salida debe recortarse a 128x96, aunque el algoritmo se dibuje fuera de esta área.
- Si su idioma / plataforma no puede generar los colores exactos descritos anteriormente, debe usar colores que estén lo más cerca posible.
- Si decide utilizar un método alternativo, debe generar exactamente el mismo resultado.
- Por si acaso: no se permite enviar el código de ensamblaje original 6502 o cualquier versión ligeramente editada.
- ¿Se puede vencer a 250 bytes? Feliz dibujo!
Respuestas:
x86 código de operación,
227224223 bytesImagen:
fuente
0122 6681F7B71DC104 xor edi, 00001DB7
error encontrado en W32DasmConjunto 8086 - NASM (MBR) -
248245bytesfuente
xor dx,dx
y cambiamov bp,0xa000; mov es,bp
apush 0xa000; pop es
.PUSH imm
Excel VBA de 32 bits,
1011720 bytesRevisión 49; Puntuación Δ = 291 bytes
Golfed
Sub
Rutina completa que no toma ninguna entrada y envía la Mona Lisa alActiveSheet
objeto en el rango[A1:DX96]
.Hubo una gran cantidad de magia negro involucrado en el golf esto a su estado actual, - de la nota, algunos de los trucos que participan son píxeles de preparación técnica , el desplazamiento de bits colores conversión implícita , y la
la compresión de bytes como unabase64
compresión deString
.Nota: Esta solución se ha restringido a las versiones de 32 bits de Excel VBA, como
^
es elLongLong
tipo literal en las versiones de 64 bitsNota, el segundo: la cadena es la línea 3 no es un comentario, ya
”
que no es equivalente a"
Salida
Gif que muestra la salida a
ActiveSheet
cuandoM
se llama en la ventana inmediata de VBE. Tenga en cuenta que debido a las limitaciones de tamaño de archivo, este gif dehigostiene menos cuadros que los realmente producidos.Sin golf
Rutina completa sin golf
sub
que no toma ninguna entrada y produce la Mona Lisa usando el método descrito anteriormente en elActiveSheet
objetofuente
HTML + CSS + JavaScript (ES6), 499 bytes
678...478475473465459455451447449 bytesNo está cerca de 250 bytes, ¡pero definitivamente me conformaré con menos de 500 bytes! Muchísimas gracias a @Arnauld y @Firefly por ayudarme a jugar golf con este monstruo.
Para una escala más grande, reemplace el CSS con lo siguiente:
Historia anotada!
Me divertí mucho jugando al código de referencia de Arnauld, y puedes obtener algo de eso aquí. ¡Disfrutar!
Mostrar fragmento de código
fuente
Befunge,
11311052 bytesHay una serie de problemas que hacen que este sea un problema desafiante en Befunge:
Befunge solo tiene 2000 bytes de memoria para trabajar (y eso incluye el código fuente), por lo que no hay forma de que podamos renderizar toda la imagen en la memoria antes de enviarla. La forma en que lo soluciono es ejecutando repetidamente el algoritmo 96 veces, una vez para cada línea. Cada ejecución almacena solo los píxeles necesarios para la línea actual, que luego se muestran al final de la ejecución. Esto nos permite sobrevivir con un búfer de píxeles de solo 128 bytes.
Befunge no tiene operaciones de bit en absoluto. Muchas de las
AND
operaciones se pueden emular simplemente con un operador de módulo (por ejemplo,a AND 0x7F
se puede reemplazar cona % 0x80
). Sin embargo, estoXOR
requiere una manipulación de bits bastante complicada, que tenemos que tratar con un byte a la vez, usando un conjunto de fórmulas personalizadas codificadas para manejar los cuatro bytes que necesitamos. Por ejemplo, para calculara XOR 0xC1
, usamos la fórmula:a + 0xC1 - (a/64%4*64 + a%2)*2
Si bien no es una limitación de Befunge per se, la interfaz en TIO es incapaz de manejar caracteres ASCII extendidos en la fuente, lo que habría sido la forma más fácil de almacenar el pincel y las tablas de colores. Evito esto generando esas tablas como una lista de números en la pila, luego tengo un pequeño bucle de inicialización que copia los valores de la pila a la memoria. Una parte importante de mi tiempo la pasé jugando al golf en esta mesa, que ocupa las primeras cinco líneas y media del código.
Desafortunadamente, a pesar de todo mi esfuerzo para hacer que el código sea compatible con TIO, y mi elección de un formato de archivo que podría extraerse de TIO ( PPM ), es demasiado lento para completarlo dentro del límite de tiempo de 60 segundos (probablemente ejecute el algoritmo 96 veces no ayuda) Pero como genera la imagen línea por línea, aún debe obtener suficiente salida para recuperar casi la mitad de la imagen.
Pruébalo en línea!
Si no tiene un visor de archivos PPM local, puede convertir fácilmente a otro formato utilizando uno de los muchos convertidores en línea. Un ejemplo es Convertio .
fuente
Python 3,
544536523519518 bytesEsta es una versión más reducida de la traducción de Python de CCB60 de la implementación de referencia. Originalmente usé un número hexadecimal grande para representar el pincel del algoritmo, pero luego me di cuenta de que mi suposición infundada de que una representación de cadena Unicode no funcionaría en Python era falsa.
Originalmente pensé que mi recuento de bytes era significativamente menor, pero como lo señaló ASCII , no recordé contar los caracteres Unicode como más de un byte.
Salida (128 x 96)
Idéntico a la salida de CCB60.
fuente
Java 7,
681677675626612610 bytesEmite la siguiente imagen en resolución 128x96:
Sé que ni siquiera está cerca de 250 bytes, pero bueno, es Java
-2 bytes gracias a Zacharý
fuente
#Language, <s>Old Scores</s> Score Bytes
y 2 puede hacer que su código sea un poco más legible agregando un indicador de idioma del formulario<!-- language-all: lang-java -->
antes su bloque de código0x04C11DB7
=>0x4C11DB7
y0x7f
=>127
. No te vuelvas loco cuando no sea necesario.C #,
960850 bytesUna copia directa del pseudocódigo con algo de golf agregado. Todavía hay mucho que se puede jugar al golf, pero quería publicar mi respuesta para que la pelota ruede.
Versión completa / formateada:
fuente
var m = new Bitmap(128,96)
AE IU WAUGH WYPython 2.7;
880876 bytes en total (incluyendo los datos)-4 bytes a 876 gracias a ZacharyT. (A mi intérprete de Python no le gustó su sugerencia de eliminar los espacios entre los 80 y otros).
La sugerencia de Taylor Scott de colocar el pincel en la Base 10 es excelente, pero notjagan (en un comentario) llevó su sugerencia un paso más allá, utilizando el formato entero extendido de Python en hexadecimal. La respuesta de notjagan está en Python 3, y es una mejora tan grande de lo que hice que merece crédito. Espero que lo publique como una respuesta separada.
Salida a una ventana Tkinter. Sin escala, la imagen es muy pequeña, pero la escala agrega aproximadamente una docena de bytes al recuento.
No hay mucho que hacer aquí, excepto la traducción a Python y algo de golf básico. A veces, las manipulaciones de bits son más cortas, a veces las matemáticas enteras. No pude encontrar una manera de empaquetar más de la lógica en listas o matrices. El algoritmo básico ya es bastante denso.
fuente
<!-- language-all: lang-py -->
80
's y laselse
' s. Y,0x00
es lo mismo que0
, ¿verdad?import
y*
.Tcl / Tk, 805
808815816819826839840843Todavíasoyel perdedor, ¡perotuve que hacerlo! puede ser que pueda jugarlo más tarde!No es el perdedor ahora!
Tcl / Tk, 1370
¡Una transliteración muy inexpresiva del Pseudocódigo antes de que comenzara la juerga de golf! ¡La
update
línea hace posible ver el dibujo que se realiza progresivamente!fuente
Python 3 + matplotlib, 541
Esto guarda la imagen como un archivo png "i". Para mostrar la imagen, puede reemplazar el imsave con un imshow y un show de 545 bytes.
fuente
SmileBASIC,
454447444 bytesLa cadena de "x" tenía algunos caracteres Unicode no válidos, por lo que no puedo publicarla aquí. Aquí están los códigos de caracteres en decimal (solo la matriz BRUSH en reversa):
8505, 11193, 11332, 40503, 9639, 38606, 12590, 44957, 49275, 9103, 45629, 7700, 44387, 16047, 36156, 21056, 32967, 44146, 47330, 6263, 59670, 16059, 2569, 1043, 21292, 45297, 10516, 35478, 45332, 45634, 21547, 54321, 12369, 54650, 3453, 32252, 41772, 10669, 2137, 35575, 41799, 37027, 38901, 57113, 9942, 15633, 8348, 8339, 40146, 53425, 640, 28853, 45146, 47166, 37752, 3773, 6923, 35473, 62875, 3644, 1835, 12187, 14270, 778
fuente
"xx...xx"
cadena?: r4, 764 bytes
la fuente para ejecutar en : r4 github
Utilizo un truco para hacer el movimiento sin condicionales, transformar el bit 8 en signo y cambiar con la versión del bit 2. con nombres de pila:
fuente
Yabasic,
790779 bytesUna respuesta básica que no lleva entradas y salidas a una nueva ventana gráfica.
Salida
El siguiente es escalado por un factor de 8
fuente