Entrada : un color hexadecimal RGBA c
(ej. FFFF00FF
) Y un entero> 0 y <1000 n
(ej. 200
).
Salida : Raw bytes de un archivo PNG de tal manera que cuando la salida se guarda en un archivo y se abre en un visor de imágenes, una n
por n
imagen llena de color c
en la pantalla.
Especificación : Su programa debería generar exactamente :
- un encabezado PNG (
89504E470D0A1A0A
en hexadecimal) - un
IHDR
fragmento que contiene estas especificaciones:- ancho: la entrada anterior
n
- altura: la entrada anterior
n
- profundidad de bits:
8
(RGBA
) - tipo de color:
6
(truecolor con alfa) - método de compresión:
0
- método de filtro:
0
- método entrelazado:
0
- ancho: la entrada anterior
- uno o más
IDAT
fragmentos que contienen los datos de la imagen (una imagen sólida de color ingresada previamentec
); puede estar comprimido o sin comprimir - un
IEND
fragmento de imagen final
Más detalles disponibles en Wikipedia , en el sitio W3 , o mediante una búsqueda en Google.
Restricciones :
- No puede utilizar ninguna biblioteca de imágenes o funciones diseñadas para trabajar con imágenes de ningún tipo.
- Su programa debe ejecutarse en menos de 3 minutos y generar un archivo de menos de 10 MB para todas las entradas (verificación de sanidad).
- Este es el código de golf , ¡así que el código más corto en bytes ganará!
code-golf
graphical-output
Pomo de la puerta
fuente
fuente
999x999
archivo tiene más de 30720 píxeles, por lo que parece contradictorio.Respuestas:
Perl, 181
El tamaño es de 180 bytes y
-p
se necesita la opción (+1). La puntuación es entonces 181.Los argumentos se proporcionan a través de STDIN en una línea, separados por un espacio, el color como valor hexadecimal (16 caracteres) y el número de píxeles para ancho / alto, por ejemplo:
El tamaño del archivo es de 832 bytes. La imagen de tamaño máximo (n = 999) con el mismo color tiene 6834 bytes (muy por debajo de 10 MB).
La solución usa dos bibliotecas:
use Digest::CRC crc32;
para los valores CRC32 en el fragmento finaliza.use IO::Compress::Deflate deflate;
para comprimir los datos de la imagen.Ambas bibliotecas no están relacionadas con las imágenes.
Sin golf:
Ediciones
use IO::Compress::Deflate':all';
se sustituye poruse Compress::Zlib;
. Este último exporta la función desinflarcompress
por defecto. La función no necesita referencias como argumentos y también devuelve el resultado directamente. Eso permite deshacerse de la variable$o
.Gracias por la respuesta de Michael :
Función
k
:pack
se puede eliminar una llamada de mediante el uso de la plantillaNa*N
para el primeropack
en la función.pack
La plantillaNNCV
con cuatro valores se optimizaNNC3n
con seis valores.Gracias por el comentario de VadimR con muchos consejos:
use String::CRC32;
es más corto queuse Digest::CRC crc32;
.y///c-4
es más corto que-4+y///c
.CH*
con la repetición en el valor.$i
mediante el uso de una referencia de valor.-p
) con la coincidencia del separador de espacio/ /
. Entonces$`
entra la primera opción y entra el segundo argumento$'
.-p
también imprime automáticamente$_
."\cZ"
es más corto que"\x1a"
.Mejor compresión
A costa del tamaño del código, los datos de la imagen pueden comprimirse aún más, si se aplica el filtrado.
Tamaño de archivo sin filtrar para
FFFF0FF
200
: 832 bytesFiltro
Sub
(diferencias de píxeles horizontales): 560 bytesFiltro
Sub
para la primera línea yUp
para las líneas restantes: 590 bytesPrimera línea sin filtrar, luego filtro
Up
: 586 bytesTambién
Compress::Zlib
se puede sintonizar; El nivel de compresión más alto se puede establecer mediante una opción adicional para el nivel de compresión en funcióncompress
a un costo de dos bytes:El tamaño del archivo de ejemplo
yellow200.png
sin filtrado disminuye de 832 bytes a 472 bytes. Aplicado al ejemplo conSub
filtro, el tamaño del archivo se reduce de 560 bytes a 445 bytes (pngcrush -brute
no se puede comprimir más).fuente
-p
. Además de las ideas en la respuesta de Michael (NA*N
y lasNNCV
plantillas), - lasString::CRC32
exportaciones de forma predeterminada,y///c-4
está bien, laCH*
plantilla,$i
desaparece\cZ
, las palabras vacías están bien-p
y/ /;
coloca los argumentos en prematch y postmatch. Me pregunto si me perdí algo y la puntuación puede ser inferior a 200 :)use Compress::Zlib;
y obtuve ≈ 10% por debajo de 200.PHP 214
No soy un experto en PHP, hay lugar para jugar al golf. Las propinas son bienvenidas.
Generar un archivo PNG:
Genere flujo base64 (pegue el resultado en la barra de direcciones de su navegador)
Versión sin golf:
fuente
Python, 252 bytes
Este script toma entrada de argv. Ejecute este script desde la línea de comando, como
python 27086.py deadbeef 999
fuente