Objectif
Créez un programme ou une paire de programmes qui perturbent et corrigent collectivement les fichiers dans le but d'empêcher LZMA2 de fonctionner efficacement. Les routines de perturbation et de correction doivent être réciproques, afin que vous puissiez récupérer le fichier d'origine exactement.
Cibles
- Les œuvres collectées de Shakespeare en plaine UTF-8 (5 589 891 octets)
- Wikimedia Commons 2013 Image de l'année en pleine résolution (1 659 847 octets)
Méthodes de compression
- Ubuntu / liés:
xz -kz5 <infile>
- Les fenêtres:
7z.exe a -txz -mx5 <outfile> <infile>
- Autre: Utilisez un compresseur LZMA2 avec un niveau de compression 5 qui comprime les œuvres de Shakespeare à 1570550 octets ± 100 octets.
Notation; somme de (tout est en octets, ls -l
ou dir
ça):
- Taille du ou des programmes (tout ce qu'il faut collectivement pour "casser" / réparer le fichier de manière réversible)
- Différence de taille (absolue) entre:
- Oeuvres brutes collectées de Shakespeare et votre copie modifiée (non compressée).
- Photo brute et votre copie modifiée (non compressée).
- Différence de taille ou 0, la valeur la plus élevée étant retenue:
- Œuvres brutes collectées de Shakespeare moins votre copie compressée LZMA2 modifiée.
- Photo brute moins votre copie compressée LZMA2 modifiée.
Exemple
Exemple de Python 2.x mal marqué, paresseusement joué, mais 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)
Fonctionnement...
$ 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
But
- = 194 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2 589 267 octets. Mauvais, mais ne rien faire dans les fichiers donne un score de 4 635 153 octets.
Clarification
C'est le golf, donc vous essayez de minimiser votre score. Je ne sais pas si les commentaires indiquent un trou légitime dans mon score ou s'ils le sont parce que je l'ai rendu trop compliqué. Dans tous les cas, vous voulez le PLUS PETIT :
- code source
- différence entre le fichier modifié non compressé et le fichier d'origine (par exemple, si vous le modifiez en ajoutant un billion de 0 à la fin, votre score a augmenté d'un billion d'octets)
- différence entre le fichier modifié compressé et le fichier d'origine (par exemple, plus les fichiers sont incompressibles, plus votre score est élevé). Un fichier parfaitement incompressible qui croît légèrement ou pas du tout donnera 0.