Tor
Erstellen Sie ein Programm oder ein Programmpaar, das gemeinsam Dateien stört und repariert, um zu verhindern, dass LZMA2 effektiv funktioniert. Die Unterbrechungs- und Korrekturroutinen müssen wechselseitig sein, damit Sie die Originaldatei genau wiederherstellen können.
Ziele
- Die gesammelten Werke von Shakespeare in einfachem UTF-8 (5.589.891 Bytes)
- Wikimedia Commons 2013 Bild des Jahres in voller Auflösung (1.659.847 Bytes)
Komprimierungsmethoden
- Ubuntu / verwandt:
xz -kz5 <infile>
- Windows:
7z.exe a -txz -mx5 <outfile> <infile>
- Sonstiges: Verwenden Sie einen LZMA2-Kompressor mit Komprimierungsstufe 5, der die Werke von Shakespeare auf 1570550 Byte ± 100 Byte komprimiert.
Wertung; Summe von (alles ist in Bytes ls -l
oder dir
so):
- Programmgröße (was auch immer zusammen benötigt wird, um die Datei reversibel zu "brechen" / zu reparieren)
- Größenunterschied (absolut) zwischen:
- Rohe gesammelte Werke von Shakespeare und Ihre modifizierte (unkomprimierte) Kopie.
- Rohfoto und Ihre modifizierte (unkomprimierte) Kopie.
- Größenunterschied oder 0, je nachdem, welcher Wert größer ist zwischen:
- Rohe gesammelte Werke von Shakespeare abzüglich Ihrer modifizierten, LZMA2-komprimierten Kopie.
- Rohfoto abzüglich Ihrer modifizierten, LZMA2-komprimierten Kopie.
Beispiel
Schlecht punktendes, träge Golf, aber konformes Python 2.x-Beispiel:
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)
Laufen...
$ 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
Ergebnis
- = 194 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2,589,267 Bytes. Schlecht, aber nichts mit den Dateien zu tun, ergibt eine Punktzahl von 4.635.153 Bytes.
Klärung
Dies ist Golf, also versuchen Sie, Ihre Punktzahl zu minimieren . Ich bin mir nicht sicher, ob die Kommentare auf ein legitimes Loch in meiner Wertung hinweisen oder ob sie es sind, weil ich es zu kompliziert gemacht habe. In jedem Fall möchten Sie das KLEINSTE :
- Quellcode
- Unterschied zwischen der unkomprimierten geänderten Datei und der Originaldatei (z. B. wenn Sie sie ändern, indem Sie am Ende eine Billion Nullen anhängen, ist Ihre Punktzahl nur um eine Billion Bytes gestiegen)
- Unterschied zwischen der komprimierten modifizierten Datei und der Originaldatei (z. B. je inkompressibler die Dateien werden, desto höher ist Ihre Punktzahl). Eine perfekt inkompressible Datei, die leicht oder gar nicht wächst, erhält 0 Punkte.