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
Réponses:
Java → CJam, score ≈4417,89
Nécessite le pot CJam dans le chemin de classe. Si vous lui donnez 2 arguments de ligne de commande (nom de fichier et qualité), il ajoute ".cjam" au nom de fichier et y écrit l'image compressée. Sinon, il calcule son score sur les 5 images de test, qui sont supposées se trouver dans le répertoire courant. Le programme vérifie également automatiquement chaque image compressée. Vous voudrez peut-être revérifier le calcul du score en cas de divergence.
Les techniques utilisées (jusqu'à présent) sont: la réduction de moitié (horizontalement, verticalement ou les deux) si cela ne réduit pas trop la qualité, un RLE codé sur mesure et une conversion de base pour regrouper plus de données dans chaque caractère tout en restant dans le gamme ASCII imprimable.
la source
javac -cp cjam-0.6.5.jar Compress.java
, maisjava -cp cjam-0.6.5.jar Compress
ditError: Could not find or load main class Compress
etjava Compress
ne trouve pas la classe CJam.-cp .:cjam-0.6.5.jar
(dans windoze je pense que vous avez besoin d'un point-virgule au lieu d'un deux-points)Python 3.5 (principal et sortie) (actuellement non compétitif)
Joyeux anniversaire, défi! Voici votre cadeau: une réponse!
EDIT: sortie convertie en code python, taux de compression amélioré (légèrement) EDIT2: l'a rendu brut quand
size
est 1. Amélioration du score, mais le score doit être calculé à nouveau. EDIT3: @Dennis a souligné que j'avais encore des bugs à corriger, j'ai donc marqué la réponse comme non compétitiveCode:
Cette réponse pourrait utiliser beaucoup d'améliorations, donc je vais probablement y travailler plus au cours du week-end.
Comment cela fonctionne:
size
.size
et réessayez.Cet algorithme fonctionne bien pour une faible qualité (0,5, 0,6) mais ne fonctionne pas trop bien sur les images de meilleure qualité (gonfle en fait). C'est aussi très lent.
Ici, j'ai tous les fichiers générés, vous n'aurez donc pas à les recréer.
la source
comping
devrait êtrecompimg
), que j'ai corrigé pour exécuter le programme. Sauf si j'ai fait une erreur lors de l'exécution de votre code, les dimensions de certaines des images générées sont incorrectes (par exemple,image2.txt
a 33 164 octets, mais 33image2-50.0.txt
329) et d'autres ne génèrent pas le même fichier lors de l'exécution des programmes générés (image3-50.0.txt
a une qualité de 0,5110 , mais l'exécution du programme généré donne une qualité de 0,4508 ).image3-50.0.py
partir de votre Dropbox et il correspond au fichier que j'ai généré.