Мета
Створіть програму або пару програм, які спільно руйнують та виправляють файли з метою запобігання ефективній роботі LZMA2. Програми зриву та виправлення повинні бути взаємними, тому ви можете точно відновити вихідний файл.
Цілі
- Зібрані твори Шекспіра на простоті UTF-8 (5,589,891 байт)
- Wikimedia Commons 2013 Зображення року з повною роздільною здатністю (1,659,847 байт)
Методи стиснення
- Ubuntu / пов'язані:
xz -kz5 <infile>
- Windows:
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 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2589,267 байт. Погано, але нічого не робити для файлів, ви отримуєте 4,635,153 байт.
Уточнення
Це гольф, тому ви намагаєтеся мінімізувати свій рахунок. Я не впевнений, чи зазначають у коментарях законну дірку в моєму оцінці, чи вони є, тому що я зробив це занадто складно. У будь-якому випадку, ви хочете, щоб найменше :
- вихідний код
- різниця між нестисненим модифікованим файлом та оригінальним файлом (наприклад, якщо ви модифікуєте його, додавши трильйон 0 в кінці, ваш рахунок просто збільшився на трильйон байтів)
- різниця між стиснутим модифікованим файлом та оригінальним файлом (наприклад, чим більше стискаються файли, тим вищий результат). Ідеально нестислимий файл, який трохи зростає або зовсім не набирає 0.