Obbiettivo
Crea un programma o una coppia di programmi che interrompano collettivamente e riparino i file con l'intento di impedire a LZMA2 di funzionare in modo efficace. Le routine di interruzione e correzione devono essere reciproche, quindi è possibile ripristinare esattamente il file originale.
obiettivi
- Le opere raccolte di Shakespeare in piano UTF-8 (5.589.891 byte)
- Immagine dell'anno 2013 di Wikimedia Commons alla massima risoluzione (1.659.847 byte)
Metodi di compressione
- Ubuntu / CORRELATI:
xz -kz5 <infile>
- Finestre:
7z.exe a -txz -mx5 <outfile> <infile>
- Altro: utilizzare un compressore LZMA2 con livello di compressione 5 che comprime le opere di Shakespeare a 1570550 byte ± 100 byte.
scoring; somma di (tutto è in byte ls -l
o dir
esso):
- Dimensione del (i) programma (i). Qualunque cosa sia necessaria collettivamente per "rompere" / correggere il file in modo reversibile
- Differenza di dimensione (assoluta) tra:
- Lavori grezzi raccolti di Shakespeare e copia modificata (non compressa).
- Foto non elaborata e copia modificata (non compressa).
- Differenza di dimensioni o 0, a seconda di quale sia maggiore tra:
- Opere raccolte a crudo di Shakespeare meno la tua copia compressa LZMA2 modificata.
- Foto non elaborata meno la copia compressa LZMA2 modificata.
Esempio
Esempio di Python 2.x con scarso punteggio, pigramente giocato a golf, ma conforme:
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)
In esecuzione...
$ 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
Punto
- = 194 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2.589.267 byte. Cattivo, ma non fare nulla ai file produce un punteggio di 4.635.153 byte.
Una precisazione
Questo è il golf, quindi stai cercando di ridurre al minimo il tuo punteggio. Non sono sicuro se i commenti indicano un buco legittimo nel mio punteggio o se lo sono perché l'ho reso troppo complicato. In ogni caso, vuoi il PIÙ PICCOLO :
- codice sorgente
- differenza tra il file modificato non compresso e il file originale (ad es. se lo si modifica aggiungendo un trilione di 0 alla fine, il punteggio è salito di un trilione di byte)
- differenza tra il file modificato compresso e il file originale (ad esempio, più i file sono incomprimibili, più alto è il punteggio). Un file perfettamente incomprimibile che cresce leggermente o per niente conterrà 0.