Entrada : uma cor hexadecimal RGBA c
(ex. FFFF00FF
) E um número inteiro> 0 e <1000 n
(ex. 200
).
Saída : bytes brutos de um arquivo PNG, de modo que, quando a saída é salva em um arquivo e aberta em um visualizador de imagens, uma imagem n
por n
preenchida com a cor c
é exibida.
Especificação : Seu programa deve gerar exatamente :
- um cabeçalho PNG (
89504E470D0A1A0A
em hexadecimal) - um
IHDR
pedaço contendo estas especificações:- width: a entrada anterior
n
- height: a entrada anterior
n
- profundidade de bits:
8
(RGBA
) - tipo de cor:
6
(truecolor com alfa) - método de compressão:
0
- método de filtro:
0
- método entrelaçado:
0
- width: a entrada anterior
- um ou mais
IDAT
pedaços contendo os dados da imagem (uma imagem sólida de cor inserida anteriormentec
); pode ser compactado ou descomprimido - uma
IEND
parte final da imagem
Mais detalhes disponíveis na Wikipedia , no site W3 ou através de uma pesquisa no Google.
Restrições :
- Você não pode usar nenhuma biblioteca de imagens ou funções projetadas para trabalhar com imagens de qualquer tipo.
- Seu programa deve ser executado em menos de 3 minutos e gerar um arquivo com menos de 10 MB para todas as entradas (verificação de integridade).
- Isso é código-golfe , então o código mais curto em bytes vencerá!
code-golf
graphical-output
Maçaneta da porta
fonte
fonte
999x999
arquivo tem mais de 30720 pixels, o que parece contraditório.Respostas:
Perl, 181
O tamanho é de 180 bytes e a opção
-p
é necessária (+1). A pontuação é então 181.Os argumentos são dados via STDIN em uma linha, separados por um espaço, a cor como valor hexadecimal (16 caracteres) e o número de pixels para largura / altura, por exemplo:
O tamanho do arquivo é 832 bytes. A imagem de tamanho máximo (n = 999) da mesma cor possui 6834 bytes (muito abaixo de 10 MB).
A solução usa duas bibliotecas:
use Digest::CRC crc32;
para os valores de CRC32 nas extremidades dos blocos.use IO::Compress::Deflate deflate;
para comprimir os dados da imagem.Ambas as bibliotecas não estão relacionadas a imagens.
Ungolfed:
Editar% s
use IO::Compress::Deflate':all';
é substituído poruse Compress::Zlib;
. O último exporta a função de desinflarcompress
por padrão. A função não precisa de referências como argumentos e também retorna o resultado diretamente. Isso permite livrar-se da variável$o
.Obrigado pela resposta de Michael :
Função
k
: uma chamada depack
pode ser removida usando o modeloNa*N
para o primeiropack
na função.pack
modeloNNCV
com quatro valores otimizaNNC3n
com seis valores.Obrigado pelo comentário do VadimR com muitas dicas:
use String::CRC32;
é mais curto queuse Digest::CRC crc32;
.y///c-4
é mais curto que-4+y///c
.CH*
com a repetição no valor.$i
usando uma referência de valor.-p
) com o separador de espaço/ /
. Então a primeira opção está dentro$`
e o segundo argumento entra$'
.-p
também imprime automaticamente$_
."\cZ"
é mais curto que"\x1a"
.Melhor compressão
À custa do tamanho do código, os dados da imagem podem ser ainda mais compactados, se a filtragem for aplicada.
Tamanho do arquivo não filtrado para
FFFF0FF
200
: 832 bytesFiltro
Sub
(diferenças de pixel horizontal): 560 bytesFiltre
Sub
a primeira linha eUp
as linhas restantes: 590 bytesPrimeira linha não filtrada e depois filtrar
Up
: 586 bytesTambém
Compress::Zlib
pode ser ajustado; o nível mais alto de compactação pode ser definido por uma opção adicional para o nível de compactação em funçãocompress
ao custo de dois bytes:O tamanho do arquivo do exemplo
yellow200.png
sem filtragem diminui de 832 bytes para 472 bytes. Aplicado ao exemplo comSub
filtro, o tamanho do arquivo diminui de 560 bytes para 445 bytes (pngcrush -brute
não é possível compactar mais).fonte
-p
. Além das informações da resposta de Michael (NA*N
eNNCV
modelos), - asString::CRC32
exportações por padrãoy///c-4
estão OK, oCH*
modelo$i
desapareceu\cZ
, as palavras de barras estão OK-p
e/ /;
coloca os argumentos em prematura e pós-correspondência. Pergunto-me se eu perdi alguma coisa e pontuação pode ficar abaixo de 200 :)use Compress::Zlib;
e tem ≈ 10% abaixo de 200.PHP 214
Eu não sou um especialista em PHP, há lugar para jogar golfe. Dicas são bem-vindas.
Gere um arquivo PNG:
Gere fluxo base64 (cole o resultado na barra de endereços do navegador)
Versão não destruída:
fonte
Python, 252 bytes
Este script recebe entrada do argv. Execute esse script na linha de comando, como
python 27086.py deadbeef 999
fonte