fundo
PICASCII é uma ferramenta elegante que converte imagens em arte ASCII.
Atinge diferentes graus de brilho usando os dez caracteres ASCII a seguir:
@#+';:,.`
Diremos que esses charxels (elementos de caractere) têm brilho de 1 (sinal de arroba) a 10 (espaço).
Abaixo, você pode ver os resultados da conversão de um pequeno código, a bandeira galesa, um fractal estendido, uma truta grande e um pouco de golfe, exibidos com a fonte correta:
Você pode ver as imagens neste violino e fazer o download delas no Google Drive .
Tarefa
Embora os resultados finais do PICASCII sejam visualmente agradáveis, todas as cinco imagens combinadas pesam 153.559 bytes. Quanto essas imagens podem ser compactadas se estivermos dispostos a sacrificar parte de sua qualidade?
Sua tarefa é escrever um programa que aceite uma imagem artística ASCII como as anteriores e uma qualidade mínima como entrada e imprima uma compactação com perdas da imagem - na forma de um programa completo ou de uma função retornando uma única sequência - que satisfaça a exigência de qualidade.
Isso significa que você não consegue escrever um descompressor separado; ele deve estar embutido em cada uma das imagens compactadas.
A imagem original consistirá em charxels com brilho entre 1 e 10, separados por feeds de linha em linhas do mesmo comprimento. A imagem compactada deve ter as mesmas dimensões e usar o mesmo conjunto de caracteres.
Para uma imagem não compactada que consiste em n charxels, a qualidade de uma versão compactada da imagem é definida como
onde c i é o brilho do i- ésimo charxel da saída da imagem compactada e u é o brilho do i- ésimo charxel da imagem não compactada.
Pontuação
Seu código será executado com as cinco imagens acima como entrada e configurações de qualidade mínima de 0,50, 0,60, 0,70, 0,80 e 0,90 para cada uma das imagens.
Sua pontuação é a média geométrica dos tamanhos de todas as imagens compactadas, ou seja, a vigésima quinta raiz do produto, dos comprimentos de todas as vinte e cinco imagens compactadas.
A pontuação mais baixa vence!
Regras adicionais
Seu código precisa funcionar para imagens arbitrárias, não apenas para as usadas na pontuação.
Espera-se que você otimize seu código para os casos de teste, mas um programa que nem tente compactar imagens arbitrárias não receberá um voto positivo de mim.
O seu compressor pode usar compressores de fluxo de bytes embutidos (por exemplo, gzip), mas você mesmo deve implementá-los para as imagens compactadas.
Bulit-ins normalmente usados em descompressores de fluxo de bytes (por exemplo, conversão de base, decodificação no comprimento da execução) são permitidos.
Compressor e imagens compactadas não precisam estar no mesmo idioma.
No entanto, você deve escolher um único idioma para todas as imagens compactadas.
Para cada imagem compactada, aplicam-se regras de código padrão de golfe.
Verificação
Criei um script CJam para verificar facilmente todos os requisitos de qualidade e calcular a pontuação de um envio.
Você pode fazer o download do interpretador Java aqui ou aqui .
e# URLs of the uncompressed images.
e# "%s" will get replaced by 1, 2, 3, 4, 5.
"file:///home/dennis/codegolf/53199/original/image%s.txt"
e# URLs of the compressed images (source code).
e# "%s-%s" will get replaced by "1-50", "1-60", ... "5-90".
"file:///home/dennis/codegolf/53199/code/image%s-%s.php"
e# URLs of the compressed images (output).
"file:///home/dennis/codegolf/53199/output/image%s-%s.txt"
e# Code
:O;:C;:U;5,:)
{
5,5f+Af*
{
C[IQ]e%g,X*:X;
ISQS
[U[I]e%O[IQ]e%]
{g_W=N&{W<}&}%
_Nf/::,:=
{
{N-"@#+';:,.` "f#}%z
_::m2f#:+\,81d*/mq1m8#
_"%04.4f"e%S
@100*iQ<"(too low)"*
}{
;"Dimension mismatch."
}?
N]o
}fQ
}fI
N"SCORE: %04.4f"X1d25/#e%N
Exemplo
Bash → PHP, pontuação 30344.0474
cat
Atinge 100% de qualidade para todas as entradas.
$ java -jar cjam-0.6.5.jar vrfy.cjam 1 50 1.0000 1 60 1.0000 1 70 1.0000 1 80 1.0000 1 90 1.0000 2 50 1.0000 2 60 1.0000 2 70 1.0000 2 80 1.0000 2 90 1.0000 3 50 1.0000 3 60 1.0000 3 70 1.0000 3 80 1.0000 3 90 1.0000 4 50 1.0000 4 60 1.0000 4 70 1.0000 4 80 1.0000 4 90 1.0000 5 50 1.0000 5 60 1.0000 5 70 1.0000 5 80 1.0000 5 90 1.0000 SCORE: 30344.0474