Contexte
PICASCII est un outil soigné qui convertit les images en art ASCII.
Il atteint différents degrés de luminosité en utilisant les dix caractères ASCII suivants:
@#+';:,.`
Nous dirons que ces charxels (éléments de caractère) ont des luminosités de 1 (au signe) à 10 (espace).
Ci-dessous, vous pouvez voir les résultats de la conversion d'un petit code, le drapeau gallois, une fractale en surplomb, une grosse truite et un petit golf, affichés avec la police correcte:
Vous pouvez voir les images dans ce violon et les télécharger depuis Google Drive .
Tâche
Bien que les résultats finaux de PICASCII soient visuellement agréables, les cinq images combinées pèsent 153 559 octets. Combien ces images pourraient-elles être compressées si nous sommes prêts à sacrifier une partie de leur qualité?
Votre tâche consiste à écrire un programme qui accepte une image d'art ASCII telle que celles ci-dessus et une qualité minimale en entrée et imprime une compression avec perte de l'image - sous la forme d'un programme complet ou d'une fonction renvoyant une seule chaîne - qui satisfait la exigence de qualité.
Cela signifie que vous ne pouvez pas écrire un décompresseur séparé; il doit être intégré à chacune des images compressées.
L'image originale sera constituée de charxels avec des luminosités comprises entre 1 et 10, séparés par des sauts de ligne en lignes de même longueur. L'image compressée doit avoir les mêmes dimensions et utiliser le même jeu de caractères.
Pour une image non compressée composée de n charxels, la qualité d'une version compressée de l'image est définie comme
où c i est la luminosité du i ème charxel de la sortie de l'image compressée et u i la luminosité du i ème charxel de l'image non compressée.
Notation
Votre code sera exécuté avec les cinq images ci-dessus comme paramètres d'entrée et de qualité minimale de 0,50, 0,60, 0,70, 0,80 et 0,90 pour chacune des images.
Votre score est la moyenne géométrique des tailles de toutes les images compressées, c'est-à-dire la vingt-cinquième racine du produit des longueurs des vingt-cinq images compressées.
Le score le plus bas gagne!
Règles supplémentaires
Votre code doit fonctionner pour les images arbitraires, pas seulement celles utilisées pour la notation.
Il est prévu que vous optimisez votre code vers les cas de test, mais un programme qui ne même pas essayer de compresser les images arbitraires n'obtenir un upvote de moi.
Votre compresseur peut utiliser des compresseurs de flux d'octets intégrés (par exemple, gzip), mais vous devez les implémenter vous-même pour les images compressées.
Les Bulit-ins normalement utilisés dans les décompresseurs de flux d'octets (par exemple, la conversion de base, le décodage de longueur) sont autorisés.
Le compresseur et les images compressées ne doivent pas nécessairement être dans la même langue.
Cependant, vous devez choisir une seule langue pour toutes les images compressées.
Pour chaque image compressée, les règles de golf de code standard s'appliquent.
Vérification
J'ai créé un script CJam pour vérifier facilement toutes les exigences de qualité et calculer le score d'une soumission.
Vous pouvez télécharger l'interpréteur Java ici ou ici .
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
Exemple
Bash → PHP, score 30344.0474
cat
Atteint une qualité de 100% pour toutes les entrées.
$ 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