ゴール
LZMA2が効果的に機能しないように、ファイルをまとめて中断および修正するプログラムまたはプログラムのペアを作成します。中断および修正ルーチンは相互に関係する必要があるため、元のファイルを正確に回復できます。
対象
- シェークスピアの収集された作品は、プレーンUTF-8(5,589,891バイト)
- ウィキメディアコモンズ2013ピクチャーオブザイヤーフル解像度(1,659,847バイト)
圧縮方法
- Ubuntu /関連:
xz -kz5 <infile>
- ウィンドウズ:
7z.exe a -txz -mx5 <outfile> <infile>
- その他:シェークスピアの作品を1570550バイト±100バイトに圧縮する圧縮レベル5のLZMA2コンプレッサーを使用します。
得点; 合計(すべてはバイト単位、ls -l
またはdir
それ):
- プログラムのサイズ(ファイルを可逆的に「ブレイク」/修正するために必要なもの)
- 次のサイズの差(絶対):
- シェークスピアの未加工の収集作品と、修正された(非圧縮の)コピー。
- 未加工の写真と変更した(非圧縮)コピー。
- サイズの差または0のいずれか大きい方:
- シェークスピアの未加工の収集作品から、修正されたLZMA2圧縮コピーを差し引いたもの。
- 生の写真から変更したLZMA2圧縮コピーを差し引いたもの。
例
スコアが低く、怠laなゴルフだが、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)+ 最大(5589891 − 3014136、0)+ abs(1659874 − 1659874)+ 最大(1659874 − 1646556、0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2,589,267バイト。 悪いですが、ファイルに何もしないと、スコアは4,635,153バイトになります。
明確化
これはゴルフなので、スコアを最小化しようとしています。コメントが私の得点の正当な穴を指摘しているのか、それとも私があまりにも複雑にしたためかどうかはわかりません。いずれにせよ、あなたは最小が欲しい:
- ソースコード
- 圧縮されていない変更されたファイルと元のファイルの違い(たとえば、末尾に1兆の0を追加して変更すると、スコアは1兆バイト増加しました)
- 圧縮された変更済みファイルと元のファイルの違い(たとえば、ファイルの圧縮率が高くなるほど、スコアが高くなります)。わずかに成長する、またはまったく成長しない完全に非圧縮性のファイルは0になります。