Fondo
PICASCII es una herramienta ordenada que convierte imágenes en arte ASCII.
Alcanza diferentes grados de brillo utilizando los siguientes diez caracteres ASCII:
@#+';:,.`
Diremos que estos charxels (elementos de carácter) tienen brillos de 1 (en el signo) a 10 (espacio).
A continuación, puede ver los resultados de la conversión de un pequeño código, la bandera galesa, un fractal sobrecargado, una trucha grande y un pequeño golf, que se muestran con la fuente correcta:
Puede ver las imágenes en este violín y descargarlas de Google Drive .
Tarea
Si bien los resultados finales de PICASCII son visualmente agradables, las cinco imágenes combinadas pesan 153.559 bytes. ¿Cuánto podrían comprimirse estas imágenes si estamos dispuestos a sacrificar parte de su calidad?
Su tarea es escribir un programa que acepte una imagen artística ASCII como las anteriores y una calidad mínima como entrada e imprima una compresión con pérdida de la imagen, en forma de un programa completo o una función que devuelve una sola cadena, que satisfaga el Requisito de calidad.
Esto significa que no puede escribir un descompresor separado; debe estar integrado en cada una de las imágenes comprimidas.
La imagen original consistirá en charxels con brillos entre 1 y 10, separados por avances de línea en líneas de la misma longitud. La imagen comprimida debe tener las mismas dimensiones y usar el mismo conjunto de caracteres.
Para una imagen sin comprimir que consta de n charxels, la calidad de una versión comprimida de la imagen se define como
donde c i es el brillo del i th charxel de la salida de la imagen comprimida y u i el brillo del i th charxel de la imagen sin comprimir.
Tanteo
Su código se ejecutará con las cinco imágenes de arriba como configuraciones de entrada y calidad mínima de 0.50, 0.60, 0.70, 0.80 y 0.90 para cada una de las imágenes.
Su puntaje es la media geométrica de los tamaños de todas las imágenes comprimidas, es decir, la raíz vigésimo quinta del producto de las longitudes de las veinticinco imágenes comprimidas.
¡El puntaje más bajo gana!
Reglas adicionales
Su código tiene que funcionar para imágenes arbitrarias, no solo las que se usan para la puntuación.
Se espera que optimice su código para los casos de prueba, pero un programa que ni siquiera intenta comprimir imágenes arbitrarias no recibirá un voto positivo de mi parte.
Su compresor puede usar compresores de flujo de bytes integrados (por ejemplo, gzip), pero debe implementarlos usted mismo para las imágenes comprimidas.
Los bulit-ins normalmente utilizados en descompresores de flujo de bytes (por ejemplo, conversión de base, decodificación de longitud de ejecución) están permitidos.
El compresor y las imágenes comprimidas no tienen que estar en el mismo idioma.
Sin embargo, debe elegir un solo idioma para todas las imágenes comprimidas.
Para cada imagen comprimida, se aplican reglas de golf de código estándar.
Verificación
Hice un script de CJam para verificar fácilmente todos los requisitos de calidad y calcular el puntaje de un envío.
Puede descargar el intérprete de Java desde aquí o aquí .
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
Ejemplo
Bash → PHP, puntaje 30344.0474
cat
Logra 100% de calidad para todas las entradas.
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474