Sí, el buen viejo GIF. Amado por su versatilidad, odiado por sus patentes y parcialmente obsoleto debido a sus limitaciones (y patentes), el GIF consiste, en el núcleo, en una paleta de colores y una imagen indexada a la paleta comprimida usando el algoritmo LZW.
Su tarea es escribir un programa que lea una imagen en formato ASCII PPM (número mágico "P3") desde la entrada estándar, y escriba la misma imagen (idéntico píxel por píxel) en formato GIF en la salida estándar. La salida puede ser en forma binaria o texto ASCII con cada byte representado por un número entre 0 y 255 (inclusive), separados por espacios en blanco.
Se garantiza que la imagen de entrada no tendrá más de 256 colores diferentes.
Puntuación:
Su programa se probará en 3 imágenes de muestra, y su puntaje se calculará como:
tamaño del programa + suma (tamaño de salida - tamaño de referencia para cada imagen de muestra)
El puntaje más bajo gana.
Requisitos:
- Su programa debe funcionar con cualquier tipo similar de imágenes de varios tamaños, y no debe limitarse a las imágenes de muestra. Podría, por ejemplo, restringir las dimensiones a múltiplos de 2 o asumir que el color máximo de ppm es 255, pero aún así debería funcionar con una amplia variedad de imágenes de entrada.
- La salida debe ser un archivo GIF válido que se pueda cargar con cualquier programa compatible (después de volver a convertirlo en binario si se usa la opción de salida ASCII).
- No puede utilizar ninguna función de procesamiento de imágenes (integrada o de terceros), su programa debe contener todo el código relevante.
- Su programa debe ser ejecutable en Linux utilizando software disponible gratuitamente.
- El código fuente debe usar solo caracteres ASCII.
Imágenes de muestra:
Aquí están las 3 imágenes de muestra que se utilizarán para calificar. Puede descargar un archivo zip con los archivos ppm (use el botón de descarga en la parte superior de esa página). O puede convertirlos de las imágenes png a continuación, usando ImageMagick con el siguiente comando:
convert file.png -compress none file.ppm
También proporciono las sumas de verificación MD5 de los archivos ppm para su confirmación.
1. ámbar
Tamaño de referencia: 38055
MD5 suma de comprobación de ppm: d1ad863cb556869332074717eb278080
2. ojos azules
Tamaño de referencia: 28638
MD5 suma de comprobación de ppm: e9ad410057a5f6c25a22a534259dcf3a
3. pimientos
Tamaño de referencia: 53586
MD5 suma de comprobación de ppm: 74112dbdbb8b7de5216f9e24c2e1a627
fuente
Respuestas:
Perl, 515 + -2922 + 0 + -2571 = -4978
Otro enfoque. Esta vez estoy tratando de guardar la imagen en mosaicos de tamaño 64xH. Esto está bien de acuerdo con las especificaciones, pero algunos programas pueden mostrar solo el primer mosaico o una animación. Las baldosas se comprimen mejor debido a una mejor localidad espacial. Todavía hago compresión normal también para la segunda imagen y elijo lo que sea más corto. Como esto comprime la imagen dos veces, es dos veces más lenta en comparación con mi solución anterior.
Perl, 354 + 12 + 0 + -1 =
365418 9521 51168 56639O bien hay algún error en mi código o la segunda imagen está optimizada para un codificador específico, ya que un cambio aparentemente insignificante redujo el tamaño a la referencia exactamente. Toma alrededor de 30 a 60 por imagen.
Versión de golf.
La única decisión que puede tomar un compresor GIF es cuándo restablecer el diccionario LZW. En general, debido a cómo se eligieron las imágenes para esta tarea, el mejor momento para hacerlo es cada 4096 códigos, que es el momento en que el diccionario se desbordaría. Con dicho límite, el diccionario nunca se desborda, lo que ahorra un par de bytes en la implementación. Así es como funciona en detalle:
Perl, 394 + -8 + 0 + -12 = 374
Agregar una heurística para adivinar el punto de reinicio mejora un poco la compresión, pero no lo suficiente como para justificar el código adicional:
fuente
CJam, puntaje 155 + 35306 + 44723 + 21518 = 101702
Solo una tonta implementación de referencia. Es lento, no hace ninguna compresión real y no es golf.
fuente