"Une image vaut mille mots", comme le dit le vieil adage. Le mot moyen fait environ quatre caractères, donc une image transmet 4 Ko d'informations. Mais combien d' entropie , plutôt que d'informations, une image peut-elle véhiculer?
Votre tâche consiste à générer une image, exactement de 4 000 octets, avec l'entropie la plus élevée possible. Vous pouvez utiliser n'importe quelle langue, bibliothèque ou format d'image que vous choisissez, et vous pouvez exporter vers la console ou vers un fichier tant que vous téléchargez votre image ici.
Notation
Votre score est le taux de compression (4000 ÷ taille compressée) lorsque votre image est compressée avec GNU tar
version 1.28 et gzip
version 1.6, en utilisant l'algorithme DEFLATE et les paramètres par défaut - en particulier, la commande tar -czvf out.tar.gz image
. Le plus petit taux de compression gagne.
tar
inclut les métadonnées, y compris mtime, dans les fichiers de sortie par défaut. Cela affecte la taille finale du fichier compressé - certains mtimes se compressent mieux que d'autres. La modification de la commandegzip -n image
rendrait la taille de sortie déterministe indépendamment de mtime (et du nom du fichier d'entrée).gzip -n image
ne peut pas produire un fichier de plus de 4023 octets avec une entrée de 4000 octets. Il a besoin de 10 octets pour l'en-tête, 8 pour le pied de page, 1 pour l'en-tête et le remplissage du bloc DEFLATE, et 4 pour la taille du bloc DEFLATE; les autres sont simplement stockés sous forme d'octets non compressés. La plupart des fichiers composés de bits aléatoires sont stockés non compressés, comme ils devraient l'être.Réponses:
0,9514747859 (sortie 4204 octets)
Remarque: l'image ci-dessus n'est pas le fichier réel que j'ai utilisé, mais c'est l'image.
Voici un hexdump du fichier: https://gist.github.com/pommicket/cf2982e8ecf09a4de89d3a849526c64b
Le fichier est au format netpbm et peut être généré avec ce code C:
La graine aléatoire doit être transmise au programme. Après avoir essayé quelques graines, j'en ai obtenu une qui a produit un fichier compressé de 4204 octets. Comme l'a souligné Nnnes,
tar
inclura des métadonnées dans le fichier, de sorte que vos résultats peuvent différer des miens.netpbm n'est pas pris en charge partout, mais il fonctionne avec imagemagick
convert
(il suffit doncconvert image.pgm image.png
de le transformer en png).Pourquoi cette image / ce format?
Un fichier qui se compose d'octets entièrement aléatoires est très difficile à compresser (en fait, tout algorithme de compression possible fera en moyenne, pas mieux que de ne pas compresser pour les fichiers aléatoires). Le contenu du fichier réel est juste
P5 2 1993
suivi de 3986 octets aléatoires, c'est pourquoi gzip a tellement de mal à le compresser.la source
IHDR
,IDAT
et desIEND
morceaux, mais la plupart des générateurs PNG comprendront quelques morceaux facultatifs qui sont susceptibles de se comprimer assez bien - comme l'a dit Grimy - sauf peut-être les CRC qui peuvent être supposés être assez aléatoire.Brainfuck, 4201 octets compressés.
Le format d'image utilisé est PNG. Je suis presque sûr que le défi est terminé, car je laisse le script modifié de 4 instances pendant la nuit.
Explication
Alors, comment ça marche?
En utilisant un programme Java, je génère un fichier JPG. Ensuite, il est compressé et sa taille est vérifiée, ce qui me demande de le garder. J'ai exécuté ce script pendant un certain temps et il m'a généré quelques
tar.gz
fichiers de tailles différentes. Ensuite, après avoir trouvé un nouveau gagnant, le code Brainfuck est régénéré.Script bash utilisé:
Capture d'écran du programme en cours d'exécution:
Il pourrait être entièrement automatisé en supprimant la lecture et en le conservant implicitement, mais je souhaiterais en avoir le contrôle.
Le code
la source
brainfuck
partie nécessaire et mettre à jour votre score au taux de compression?