Цель
Создайте программу или пару программ, которые совместно разрушают и исправляют файлы с целью предотвращения эффективной работы LZMA2. Процедуры разрушения и исправления должны быть взаимными, чтобы вы могли точно восстановить исходный файл.
Цели
- Собрание сочинений Шекспира на равнине UTF-8 (5 589 891 байт)
- Wikimedia Commons 2013 Изображение года в полном разрешении (1 659 847 байт)
Методы сжатия
- Ubuntu / связанные:
xz -kz5 <infile>
- Окна:
7z.exe a -txz -mx5 <outfile> <infile>
- Другое: Используйте компрессор LZMA2 с уровнем сжатия 5, который сжимает произведения Шекспира до 1570550 байт ± 100 байт.
Подсчет очков; сумма (все в байтах, ls -l
или dir
это):
- Размер программы (ов) (все, что нужно, чтобы обратимо «сломать» / исправить файл)
- Разница в размере (абсолютная) между:
- Сырые собранные произведения Шекспира и ваша модифицированная (несжатая) копия.
- Необработанное фото и ваша измененная (несжатая) копия.
- Разница в размере или 0, в зависимости от того, что больше между:
- Необработанные произведения Шекспира без вашей модифицированной сжатой копии LZMA2.
- Необработанное фото без вашей модифицированной сжатой копии LZMA2.
пример
Плохо выигрывающий, лениво играющий в гольф, но совместимый пример Python 2.x:
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)
Бег...
$ 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
Гол
- = 194 + абс (5589891 - 5589891) + макс (5589891 - 3014136, 0) + абс (1659874 - 1659874) + макс (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2 589 267 байт. Плохо, но ничего не делая с файлами, получается оценка 4 635 153 байта.
осветление
Это гольф, поэтому вы пытаетесь минимизировать свой счет. Я не уверен, что комментарии указывают на законную дыру в моей оценке или они таковы, потому что я сделал это слишком сложным. В любом случае, вы хотите самый маленький :
- исходный код
- Разница между несжатым измененным файлом и исходным файлом (например, если вы измените его, добавив триллион 0 в конце, ваш счет увеличится на триллион байт)
- Разница между сжатым измененным файлом и исходным файлом (например, чем более несжимаемыми становятся файлы, тем выше ваша оценка). Совершенно несжимаемый файл, который немного увеличивается или не увеличивается вообще, получит 0.