„Obraz jest wart tysiąca słów” - tak mówi stare powiedzenie. Średnie słowo ma około czterech znaków, więc obraz przekazuje 4kB informacji. Ale ile entropii , a nie informacji, może przekazać obraz?
Twoim zadaniem jest wygenerowanie obrazu o wielkości dokładnie 4000 bajtów, z możliwie najwyższą entropią. Możesz użyć dowolnego wybranego języka, biblioteki lub formatu obrazu i możesz wyświetlać dane w konsoli lub pliku, o ile prześlesz tutaj swój obraz.
Punktacja
Twój wynik to współczynnik kompresji (rozmiar skompresowany 4000 ÷), gdy obraz jest kompresowany za pomocą GNU w tar
wersji 1.28 i gzip
wersji 1.6, przy użyciu algorytmu DEFLATE i ustawień domyślnych - w szczególności polecenia tar -czvf out.tar.gz image
. Najmniejszy współczynnik kompresji wygrywa.
źródło
tar
domyślnie uwzględnia metadane, w tym mtime, w plikach wyjściowych. Wpływa to na końcowy rozmiar skompresowanego pliku - niektóre mimesime kompresują się lepiej niż inne. Zmiana polecenia nagzip -n image
spowodowałaby, że rozmiar wyjściowy byłby deterministyczny niezależnie od mtime (i nazwy pliku wejściowego).gzip -n image
nie można utworzyć pliku większego niż 4023 bajty przy danych wejściowych o wielkości 4000 bajtów. Potrzebuje 10 bajtów na nagłówek, 8 na stopkę, 1 na nagłówek i dopełnienie bloku DEFLATE oraz 4 na rozmiar bloku DEFLATE; reszta jest przechowywana jako nieskompresowane bajty. Większość plików składających się z losowych bitów jest przechowywana bez kompresji, tak jak powinny.Odpowiedzi:
0,9514747859 (wyjście 4204 bajtów)
Uwaga: powyższy obraz nie jest faktycznym plikiem, którego użyłem, ale jest to obraz.
Oto zrzut heksowy pliku: https://gist.github.com/pommicket/cf2982e8ecf09a4de89d3a849526c64b
Plik ma format netpbm i można go wygenerować za pomocą tego kodu C:
Losowe ziarno musi zostać przekazane do programu. Po wypróbowaniu niektórych ziaren dostałem taki, który wygenerował gzipowany plik 4204 bajtów. Jak zauważył Nnnes,
tar
w pliku znajdą się metadane, więc wyniki mogą się różnić od moich.netpbm nie jest obsługiwany wszędzie, ale działa z imagemagick's
convert
(więc po prostu zrób to,convert image.pgm image.png
aby zamienić go w png).Dlaczego ten obraz / format?
Plik składający się z całkowicie losowych bajtów jest bardzo trudny do skompresowania (w rzeczywistości każdy możliwy algorytm kompresji wykona się średnio, nie lepiej niż brak kompresji dla plików losowych). Po zawartości rzeczywistego pliku
P5 2 1993
następuje 3986 losowych bajtów, dlatego gzip tak trudno go skompresuje.źródło
IHDR
,IDAT
orazIEND
, ale większość generatorów PNG będzie zawierać kilka opcjonalnych fragmentów, które prawdopodobnie dobrze się skompresują - jak powiedział Grimy - z wyjątkiem być może CRC, które można założyć być dość przypadkowym.Brainfuck, skompresowane 4201 bajtów.
Używany format obrazu to PNG. Jestem prawie pewien, że wyzwanie się skończyło, ponieważ zostawiam zmodyfikowany skrypt 4 instancji na noc.
Wyjaśnienie
Jak to działa?
Za pomocą programu Java generuję plik JPG. Następnie jest skompresowany i sprawdzany jest jego rozmiar, co sugeruje, żebym go zatrzymał. Uruchomiłem ten skrypt przez pewien czas i wygenerowałem kilka
tar.gz
plików o różnych rozmiarach. Następnie, po znalezieniu nowego zwycięzcy, kod Brainfuck jest regenerowany.Zastosowany skrypt Bash:
Zrzut ekranu z uruchomionego programu:
Mógłby być w pełni zautomatyzowany, usuwając odczyt i niejawnie, ale chciałbym mieć nad tym kontrolę.
Kod
źródło
brainfuck
część i zaktualizować swój wynik do współczynnika kompresji?