Mục tiêu
Tạo một chương trình hoặc cặp chương trình phá vỡ tập thể và sửa chữa các tệp với mục đích ngăn LZMA2 hoạt động hiệu quả. Các thói quen phá vỡ và sửa lỗi phải có đi có lại, vì vậy bạn có thể khôi phục chính xác tệp gốc.
Mục tiêu
- Các tác phẩm được thu thập của Shakespeare trong UTF-8 đơn giản (5,589,891 byte)
- Wikimedia Commons 2013 Ảnh của năm ở độ phân giải đầy đủ (1.659.847 byte)
Phương pháp nén
- Ubuntu / liên quan:
xz -kz5 <infile>
- Các cửa sổ:
7z.exe a -txz -mx5 <outfile> <infile>
- Khác: Sử dụng máy nén LZMA2 với mức nén 5 để nén các tác phẩm của Shakespeare thành 1570550 byte ± 100 byte.
Ghi điểm; tổng của (mọi thứ đều tính bằng byte ls -l
hoặc dir
nó):
- Kích thước (các) chương trình (bất cứ điều gì cần thiết để có thể đảo ngược "phá vỡ" / sửa tệp)
- Sự khác biệt về kích thước (tuyệt đối) giữa:
- Các tác phẩm được thu thập thô của Shakespeare và bản sao (không nén) đã sửa đổi của bạn.
- Ảnh thô và bản sao sửa đổi (không nén) của bạn.
- Sự khác biệt về kích thước hoặc 0, tùy theo giá trị nào lớn hơn giữa:
- Các tác phẩm được thu thập thô của Shakespeare trừ đi bản sao nén LZMA2 đã sửa đổi của bạn.
- Ảnh thô trừ bản sao nén LZMA2 đã sửa đổi của bạn.
Thí dụ
Ví dụ về điểm kém, chơi golf lười biếng, nhưng tuân thủ 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)
Đang chạy...
$ 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
Ghi bàn
- = 194 + abs (5589891 - 5589891) + tối đa (5589891 - 3014136, 0) + abs (1659874 - 1659874) + tối đa (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2.589.267 byte. Xấu, nhưng không làm gì với các tệp mang lại số điểm 4.635.153 byte.
Làm rõ
Đây là golf, vì vậy bạn đang cố gắng giảm thiểu điểm số của mình. Tôi không chắc liệu các bình luận có chỉ ra một lỗ hổng hợp pháp trong việc chấm điểm của tôi hay không nếu chúng là do tôi làm cho nó quá phức tạp. Trong mọi trường hợp, bạn muốn NHỎ :
- mã nguồn
- sự khác biệt giữa tệp sửa đổi không nén và tệp gốc (ví dụ: nếu bạn sửa đổi nó bằng cách nối thêm một nghìn tỷ 0 vào cuối, điểm số của bạn chỉ tăng lên một nghìn tỷ byte)
- sự khác biệt giữa tệp được sửa đổi nén và tệp gốc (ví dụ: các tệp càng trở nên không thể nén được, điểm của bạn càng cao). Một tập tin hoàn toàn không thể nén mà tăng nhẹ hoặc không hoàn toàn sẽ có điểm 0.