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
fuente
Respuestas:
Java → CJam, puntaje ≈4417.89
Requiere el jar de CJam en el classpath. Si le da 2 argumentos de línea de comando (nombre y calidad del archivo), agrega ".cjam" al nombre del archivo y escribe allí la imagen comprimida. De lo contrario, calcula su puntuación en las 5 imágenes de prueba, que se supone que están en el directorio actual. El programa también verifica automáticamente cada imagen comprimida. Es posible que desee verificar dos veces el cálculo de puntaje en caso de que haya alguna discrepancia.
Las técnicas utilizadas (hasta ahora) son: escalar a la mitad (horizontalmente, verticalmente o ambas) si no reduce demasiado la calidad, un RLE codificado a medida y una conversión de base para empaquetar más datos en cada personaje mientras permanece en el gama ASCII imprimible.
fuente
javac -cp cjam-0.6.5.jar Compress.java
, perojava -cp cjam-0.6.5.jar Compress
diceError: Could not find or load main class Compress
yjava Compress
no encuentra la clase CJam.-cp .:cjam-0.6.5.jar
(en Windows, creo que necesita un punto y coma en lugar de dos puntos)Python 3.5 (principal y de salida) (actualmente sin competencia)
Feliz cumpleaños, desafío! Aquí está tu regalo: una respuesta!
EDITAR: Salida convertida a código python, tasa de compresión mejorada (ligeramente) EDITAR2: Hizo que se imprima sin formato cuando
size
es 1. Puntaje mejorado, pero el puntaje debe calcularse nuevamente. EDIT3: @Dennis señaló que todavía tengo errores que corregir, así que marqué la respuesta como no competitivaCódigo:
Esta respuesta podría usar muchas mejoras, por lo que probablemente trabajaré más durante el fin de semana.
Cómo funciona esto:
size
.size
e intente nuevamente.Este algoritmo funciona bien para baja calidad (0.5, 0.6) pero no funciona muy bien en las imágenes de mayor calidad (en realidad se infla). También es muy lento.
Aquí tengo todos los archivos generados, por lo que no tendrá que volver a generarlos nuevamente.
fuente
comping
debería sercompimg
), que arreglé para ejecutar el programa. A menos que haya cometido un error al ejecutar su código, las dimensiones de algunas de las imágenes generadas son incorrectas (por ejemplo,image2.txt
tiene 33,164 bytes, peroimage2-50.0.txt
tiene 33,329) y otras no generan el mismo archivo al ejecutar los programas generados (image3-50.0.txt
tiene una calidad de 0.5110 , pero ejecutar el programa generado da como resultado una calidad de 0.4508 ).image3-50.0.py
de su Dropbox y coincide con el archivo que generé.