"Ein Bild sagt mehr als tausend Worte" - so lautet das alte Sprichwort. Das durchschnittliche Wort ist ungefähr vier Zeichen lang, sodass ein Bild 4 KB an Informationen enthält. Aber wie viel Entropie anstatt Information kann ein Bild vermitteln?
Ihre Aufgabe ist es, ein genau 4.000 Byte großes Bild mit der höchstmöglichen Entropie zu erzeugen. Sie können eine beliebige Sprache, Bibliothek oder ein beliebiges Bildformat verwenden und auf der Konsole oder in einer Datei ausgeben, solange Sie Ihr Bild hier hochladen.
Wertung
Ihre Punktzahl ist die Komprimierungsrate (4000 size komprimierte Größe), wenn Ihr Bild mit GNU tar
Version 1.28 und gzip
Version 1.6 unter Verwendung des DEFLATE-Algorithmus und der Standardeinstellungen - insbesondere des Befehls - komprimiert wird tar -czvf out.tar.gz image
. Das kleinste Kompressionsverhältnis gewinnt.
tar
Schließt standardmäßig Metadaten, einschließlich mtime, in Ausgabedateien ein. Dies wirkt sich auf die endgültige Größe der komprimierten Datei aus. Einige Dateien werden besser komprimiert als andere. Durch Ändern des Befehls in wirdgzip -n image
die Ausgabegröße unabhängig von der Zeit (und dem Namen der Eingabedatei) deterministisch.gzip -n image
kann keine Datei größer als 4023 Bytes gegeben einen 4000-Byte - Eingang erzeugen. Es benötigt 10 Bytes für den Header, 8 für die Fußzeile, 1 für den DEFLATE-Blockheader und das Auffüllen und 4 für die DEFLATE-Blockgröße. Der Rest wird nur als unkomprimierte Bytes gespeichert. Die meisten Dateien, die aus zufälligen Bits bestehen, werden unkomprimiert gespeichert, wie es sein sollte.Antworten:
0,9514747859 (4204-Byte-Ausgabe)
Hinweis: Das Bild oben ist nicht die tatsächliche Datei, die ich verwendet habe, aber es ist das Bild.
Hier ist ein Hexdump der Datei: https://gist.github.com/pommicket/cf2982e8ecf09a4de89d3a849526c64b
Die Datei hat das Format netpbm und kann mit folgendem C-Code generiert werden:
Der zufällige Startwert muss in das Programm übergeben werden. Nachdem ich einige Samen ausprobiert hatte, bekam ich einen, der eine 4204 Byte große gezippte Datei erzeugte. Wie Nnnes hervorhob,
tar
werden Metadaten in die Datei aufgenommen, sodass Ihre Ergebnisse möglicherweise von meinen abweichen.netpbm wird nicht überall unterstützt, aber es funktioniert mit imagemagick
convert
(also machen Sie einfachconvert image.pgm image.png
daraus ein png).Warum dieses Bild / Format?
Eine Datei, die nur aus zufälligen Bytes besteht, ist sehr schwer zu komprimieren (tatsächlich reicht ein möglicher Komprimierungsalgorithmus im Durchschnitt aus, nicht besser als keine Komprimierung für zufällige Dateien). Auf den Inhalt der eigentlichen Datei
P5 2 1993
folgen lediglich 3986 zufällige Bytes, weshalb es für gzip so schwierig ist, sie zu komprimieren.quelle
IHDR
,IDAT
und denIEND
Chunks, einzuschließen, aber die meisten PNG-Generatoren werden ein paar optionale Chunks enthalten, die - wie Grimy sagte - wahrscheinlich ziemlich gut komprimiert werden, außer vielleicht die CRCs, die angenommen werden können sei ziemlich zufällig.Brainfuck, 4201 Bytes komprimiert.
Das verwendete Bildformat ist PNG. Ich bin mir ziemlich sicher, dass die Herausforderung vorbei ist, da ich über Nacht 4 Instanzen modifiziertes Skript lasse.
Erklärung
Wie funktioniert es?
Mit einem Java-Programm erstelle ich eine JPG-Datei. Dann wird es komprimiert und seine Größe wird überprüft, und ich werde aufgefordert, es beizubehalten. Ich habe dieses Skript eine Weile ausgeführt und dabei ein paar
tar.gz
Dateien mit unterschiedlichen Größen erstellt. Nachdem ein neuer Gewinner gefunden wurde, wird der Brainfuck-Code neu generiert.Verwendetes Bash-Skript:
Screenshot des laufenden Programms:
Es könnte vollautomatisch sein, das Lesen zu entfernen und implizit beizubehalten, aber ich hätte gerne die Kontrolle darüber.
Der Code
quelle
brainfuck
Teil zu entfernen und Ihre Partitur auf das Kompressionsverhältnis zu aktualisieren?