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 0x7EC80000y 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, ORy XORlas 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, 00001DB7error encontrado en W32DasmConjunto 8086 - NASM (MBR) -
248245bytesfuente
xor dx,dxy cambiamov bp,0xa000; mov es,bpapush 0xa000; pop es.PUSH immExcel VBA de 32 bits,
1011720 bytesRevisión 49; Puntuación Δ = 291 bytes
Golfed
SubRutina completa que no toma ninguna entrada y envía la Mona Lisa alActiveSheetobjeto 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 unabase64compresión deString.Nota: Esta solución se ha restringido a las versiones de 32 bits de Excel VBA, como
^es elLongLongtipo 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
ActiveSheetcuandoMse 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
subque no toma ninguna entrada y produce la Mona Lisa usando el método descrito anteriormente en elActiveSheetobjetofuente
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
ANDoperaciones se pueden emular simplemente con un operador de módulo (por ejemplo,a AND 0x7Fse puede reemplazar cona % 0x80). Sin embargo, estoXORrequiere 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)*2Si 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 Bytesy 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=>0x4C11DB7y0x7f=>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,0x00es lo mismo que0, ¿verdad?importy*.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
updatelí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, 778fuente
"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