Cel
Utwórz program lub parę programów, które wspólnie zakłócają i naprawiają pliki w celu uniemożliwienia efektywnego działania LZMA2. Procedury zakłócania i naprawy muszą być wzajemne, aby można było dokładnie odzyskać oryginalny plik.
Cele
- Zebrane dzieła Szekspira w zwykłym UTF-8 (55889891 bajtów)
- Wikimedia Commons 2013 Zdjęcie roku w pełnej rozdzielczości (1 659 847 bajtów)
Metody kompresji
- Ubuntu / powiązane:
xz -kz5 <infile>
- Windows:
7z.exe a -txz -mx5 <outfile> <infile>
- Inne: Użyj kompresora LZMA2 o poziomie kompresji 5, który kompresuje dzieła Szekspira do 1570550 bajtów ± 100 bajtów.
Punktacja; suma (wszystko jest w bajtach ls -l
lub dir
to):
- Rozmiar (-y) programu (cokolwiek zbiorowo wymaga, aby odwracalnie „złamać” / naprawić plik)
- Różnica wielkości (absolutna) między:
- Surowe zebrane dzieła Szekspira i zmodyfikowana (nieskompresowana) kopia.
- Nieprzetworzone zdjęcie i zmodyfikowana (nieskompresowana) kopia.
- Różnica wielkości lub 0, w zależności od tego, która wartość jest większa między:
- Surowe zebrane dzieła Szekspira pomniejszone o zmodyfikowaną, skompresowaną kopię LZMA2.
- Nieprzetworzone zdjęcie bez zmodyfikowanej, skompresowanej kopii LZMA2.
Przykład
Słabo punktowany, leniwie golfowy, ale zgodny z Python 2.x przykład:
import sys
x = 7919 if sys.argv[1] == 'b' else -7919
i = bytearray(open(sys.argv[2], 'rb').read())
for n in range(len(i)):
i[n] = (i[n] + x*n) % 256
o = open(sys.argv[2]+'~', 'wb').write(i)
Bieganie...
$ python break.py b pg100.txt
$ python break.py f pg100.txt~
$ diff -s pg100.txt pg100.txt~~
Files pg100.txt and pg100.txt~~ are identical
$ python break.py b Glühwendel_brennt_durch.jpg
$ python break.py f Glühwendel_brennt_durch.jpg~
$ diff -s Glühwendel_brennt_durch.jpg Glühwendel_brennt_durch.jpg~~
Files Glühwendel_brennt_durch.jpg and Glühwendel_brennt_durch.jpg~~ are identical
$ xz -kz5 pg100.txt~
$ xz -kz5 Glühwendel_brennt_durch.jpg~
$ ls -ln
-rw-rw-r-- 1 2092 2092 194 May 23 17:37 break.py
-rw-rw-r-- 1 2092 2092 1659874 May 23 16:20 Glühwendel_brennt_durch.jpg
-rw-rw-r-- 1 2092 2092 1659874 May 23 17:39 Glühwendel_brennt_durch.jpg~
-rw-rw-r-- 1 2092 2092 1659874 May 23 17:39 Glühwendel_brennt_durch.jpg~~
-rw-rw-r-- 1 2092 2092 1646556 May 23 17:39 Glühwendel_brennt_durch.jpg~.xz
-rw-rw-r-- 1 2092 2092 5589891 May 23 17:24 pg100.txt
-rw-rw-r-- 1 2092 2092 5589891 May 23 17:39 pg100.txt~
-rw-rw-r-- 1 2092 2092 5589891 May 23 17:39 pg100.txt~~
-rw-rw-r-- 1 2092 2092 3014136 May 23 17:39 pg100.txt~.xz
Wynik
- = 194 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2 589 267 bajtów. Źle, ale brak działania na plikach daje wynik 4635153 bajtów.
Wyjaśnienie
To jest golf, więc starasz się zminimalizować swój wynik. Nie jestem pewien, czy komentarze wskazują na uzasadnioną lukę w mojej punktacji, czy też dlatego, że uczyniłem to zbyt skomplikowanym. W każdym razie chcesz NAJMNIEJSZY :
- kod źródłowy
- różnica między nieskompresowanym zmodyfikowanym plikiem a plikiem oryginalnym (np. jeśli zmodyfikujesz go przez dodanie bilionów zer na końcu, twój wynik wzrósł o bilion bajtów)
- różnica między skompresowanym zmodyfikowanym plikiem a plikiem oryginalnym (np. im bardziej pliki są nieściśliwe, tym wyższy wynik). Idealnie nieściśliwy plik, który rośnie nieznacznie lub wcale nie ma wartości 0.