Objetivo
Cree un programa o un par de programas que interrumpan y arreglen colectivamente archivos con la intención de evitar que LZMA2 funcione de manera efectiva. Las rutinas de interrupción y reparación deben ser recíprocas, para que pueda recuperar el archivo original exactamente.
Objetivos
- Las obras recopiladas de Shakespeare en UTF-8 simple (5,589,891 bytes)
- Imagen del año de Wikimedia Commons 2013 en resolución completa (1,659,847 bytes)
Métodos de compresión
- Ubuntu / relacionado:
xz -kz5 <infile>
- Ventanas:
7z.exe a -txz -mx5 <outfile> <infile>
- Otro: Use un compresor LZMA2 con nivel de compresión 5 que comprima las obras de Shakespeare a 1570550 bytes ± 100 bytes.
Puntuación; suma de (todo está en bytes ls -l
o dir
):
- Tamaño del programa (s) (lo que sea necesario colectivamente para "romper" / arreglar el archivo de forma reversible)
- Diferencia de tamaño (absoluto) entre:
- Obras recopiladas sin procesar de Shakespeare y su copia modificada (sin comprimir).
- Foto sin procesar y su copia modificada (sin comprimir).
- Diferencia de tamaño o 0, lo que sea mayor entre:
- Trabajos recopilados sin procesar de Shakespeare menos su copia comprimida LZMA2 modificada.
- Foto sin procesar menos su copia comprimida LZMA2 modificada.
Ejemplo
Ejemplo de Python 2.x mal puntuado, perezosamente golfizado, pero compatible:
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)
Corriendo...
$ 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
Puntuación
- = 194 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2,589,267 bytes. Malo, pero no hacer nada a los archivos produce una puntuación de 4,635,153 bytes.
Aclaración
Esto es golf, por lo que está tratando de minimizar su puntaje. No estoy seguro de si los comentarios señalan un agujero legítimo en mi puntuación o si lo son porque lo hice demasiado complicado. En cualquier caso, quieres lo MÁS PEQUEÑO :
- código fuente
- diferencia entre el archivo modificado sin comprimir y el archivo original (por ejemplo, si lo modifica agregando un billón de ceros al final, su puntaje subió un billón de bytes)
- diferencia entre el archivo modificado comprimido y el archivo original (por ejemplo, cuanto más incompresibles sean los archivos, mayor será su puntaje). Un archivo perfectamente incompresible que crezca ligeramente o no se puntuará 0.