Objetivo
Crie um programa ou par de programas que, coletivamente, interrompem e corrigem arquivos com o objetivo de impedir que o LZMA2 funcione efetivamente. As rotinas de interrupção e correção devem ser recíprocas, para que você possa recuperar exatamente o arquivo original.
Metas
- As obras coletadas de Shakespeare na planície UTF-8 (5.589.891 bytes)
- Imagem do Ano do Wikimedia Commons 2013 em resolução máxima (1.659.847 bytes)
Métodos de compressão
- Ubuntu / relacionados:
xz -kz5 <infile>
- Janelas:
7z.exe a -txz -mx5 <outfile> <infile>
- Outros: use um compressor LZMA2 com nível de compressão 5 que comprime os trabalhos de Shakespeare para 1570550 bytes ± 100 bytes.
Pontuação; soma de (tudo está em bytes, ls -l
ou dir
ele):
- Tamanho do programa (o que for necessário para coletivamente "quebrar" / corrigir o arquivo)
- Diferença no tamanho (absoluto) entre:
- Trabalhos coletados brutos de Shakespeare e sua cópia modificada (não compactada).
- Foto não processada e sua cópia modificada (não compactada).
- Diferença de tamanho ou 0, o que for maior entre:
- Obras coletadas em bruto de Shakespeare menos sua cópia compactada e modificada do LZMA2.
- Foto não processada menos sua cópia compactada LZMA2 modificada.
Exemplo
Exemplo de Python 2.x com pontuação baixa, golfe lento, mas compatível com:
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)
Corrida...
$ 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
Ponto
- = 194 + abs (5589891 - 5589891) + max (5589891 - 3014136, 0) + abs (1659874 - 1659874) + max (1659874 - 1646556, 0)
- = 194 + 0 + 2575755 + 0 + 13318
- 2.589.267 bytes. Ruim, mas não fazer nada nos arquivos gera uma pontuação de 4.635.153 bytes.
Esclarecimento
Isso é golfe, então você está tentando minimizar sua pontuação. Não tenho certeza se os comentários apontam um buraco legítimo na minha pontuação ou se são porque eu o tornei muito complicado. De qualquer forma, você deseja o MAIS PEQUENO :
- Código fonte
- diferença entre o arquivo modificado não compactado e o arquivo original (por exemplo, se você o modificar anexando um trilhão de zeros no final, sua pontuação aumentou um trilhão de bytes)
- diferença entre o arquivo modificado compactado e o arquivo original (por exemplo, quanto mais incompressíveis os arquivos se tornarem, maior será sua pontuação). Um arquivo perfeitamente incompressível que cresça um pouco ou não pontuará 0.