"Uma imagem vale mais que mil palavras" - como diz o velho ditado. Como a palavra média tem cerca de quatro caracteres, uma imagem transmite 4kB de informações. Mas quanta entropia , em vez de informação, uma imagem pode transmitir?
Sua tarefa é gerar uma imagem com exatamente 4.000 bytes de tamanho, com a maior entropia possível. Você pode usar qualquer idioma, biblioteca ou formato de imagem que escolher, e pode enviar para o console ou para um arquivo, desde que carregue sua imagem aqui.
Pontuação
Sua pontuação é a taxa de compactação (tamanho compactado de 4000 ÷) quando sua imagem é compactada com o GNU tar
versão 1.28 e gzip
versão 1.6, usando o algoritmo DEFLATE e as configurações padrão - especificamente, o comando tar -czvf out.tar.gz image
. A menor taxa de compactação vence.
tar
inclui metadados, incluindo mtime, nos arquivos de saída por padrão. Isso afeta o tamanho final do arquivo compactado - alguns mtimes são compactados melhor que outros. Alterar o comando paragzip -n image
tornaria o tamanho da saída determinístico, independentemente do mtime (e do nome do arquivo de entrada).gzip -n image
não é possível produzir um arquivo maior que 4023 bytes, com uma entrada de 4000 bytes. Ele precisa de 10 bytes para o cabeçalho, 8 para o rodapé, 1 para o cabeçalho e preenchimento do bloco DEFLATE e 4 para o tamanho do bloco DEFLATE; o restante é armazenado apenas como bytes não compactados. A maioria dos arquivos compostos por bits aleatórios é armazenada sem compressão, como deveria.Respostas:
0,9514747859 (saída de 4204 bytes)
Nota: a imagem acima não é o arquivo real que eu usei, mas é a imagem.
Aqui está um hexdump do arquivo: https://gist.github.com/pommicket/cf2982e8ecf09a4de89d3a849526c64b
O arquivo está no formato netpbm e pode ser gerado com este código C:
A semente aleatória deve ser passada para o programa. Depois de experimentar algumas sementes, consegui uma que produzia um arquivo compactado com 4204 bytes. Como Nnnes apontou,
tar
incluirá metadados no arquivo, portanto seus resultados podem diferir dos meus.O netpbm não é suportado em todos os lugares, mas funciona com o imagemagick
convert
(basta fazêconvert image.pgm image.png
-lo em um png).Por que essa imagem / formato?
Um arquivo que consiste em bytes inteiramente aleatórios é muito difícil de compactar (na verdade, qualquer algoritmo de compactação possível funciona em média, nada melhor do que não compactar arquivos aleatórios). O conteúdo do arquivo real é
P5 2 1993
seguido apenas por 3986 bytes aleatórios, e é por isso que o gzip tem tanta dificuldade em compactá-lo.fonte
IHDR
,IDAT
eIEND
pedaços, mas a maioria dos geradores PNG irá incluir um par de pedaços opcionais que são susceptíveis de compressa muito bem - como disse Grimy - exceto, talvez, do CRC que pode ser assumido como seja bem aleatório.Brainfuck, 4201 bytes compactados.
O formato da imagem usado é PNG. Tenho certeza de que o desafio acabou porque estou deixando o script modificado de 4 instâncias da noite para o dia.
Explicação
Então, como isso funciona?
Usando um programa Java, estou gerando um arquivo JPG. Em seguida, é compactado e seu tamanho está sendo verificado, solicitando que eu o mantenha. Eu executei esse script por um tempo e ele me gerou alguns
tar.gz
arquivos com tamanhos variados. Depois que um novo vencedor é encontrado, o código Brainfuck é regenerado.Script bash usado:
Captura de tela do programa em execução:
Poderia ser totalmente automatizado removendo a leitura e mantendo implicitamente, mas eu gostaria de ter controle sobre ela.
O código
fonte
brainfuck
parte necessária e atualizar sua pontuação para a taxa de compactação?