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
fonte
Respostas:
Java → CJam, pontuação 174417.89
Requer o jar CJam no caminho de classe. Se você fornecer dois argumentos de linha de comando (nome e qualidade do arquivo), ele anexará ".cjam" ao nome do arquivo e gravará a imagem compactada. Caso contrário, ele calcula sua pontuação nas 5 imagens de teste, que são consideradas no diretório atual. O programa também verifica todas as imagens compactadas automaticamente. Convém verificar novamente o cálculo da pontuação, caso haja alguma discrepância.
As técnicas usadas (até agora) são: escalar para metade (horizontal, vertical ou ambos) se não reduzir muito a qualidade, um RLE com código personalizado e conversão básica para compactar mais dados em cada caractere enquanto permanece no gama ASCII imprimível.
fonte
javac -cp cjam-0.6.5.jar Compress.java
, masjava -cp cjam-0.6.5.jar Compress
dizError: Could not find or load main class Compress
ejava Compress
não encontra a classe CJam.-cp .:cjam-0.6.5.jar
(em windoze Eu acho que você precisa de um ponto e vírgula em vez de dois pontos)Python 3.5 (principal e de saída) (atualmente não competitivo)
Feliz Aniversário, Desafio! Aqui está o seu presente: uma resposta!
EDIT: Saída convertida em código python, taxa de compactação aprimorada (ligeiramente) EDIT2: Imprimiu em bruto quando
size
é 1. Pontuação aprimorada, mas a pontuação precisa ser calculada novamente. EDIT3: @Dennis apontou que eu ainda tenho bugs para corrigir, então marquei a resposta como não-competitivaCódigo:
Esta resposta pode usar muito melhorias, então provavelmente estarei trabalhando nisso mais no fim de semana.
Como isso funciona:
size
.size
e tente novamente.Esse algoritmo funciona bem para baixa qualidade (0,5, 0,6), mas não funciona muito bem nas imagens de alta qualidade (na verdade, são infladas). Também é muito lento.
Aqui eu tenho todos os arquivos gerados, para que você não precise gerá-los novamente.
fonte
comping
deveria sercompimg
), que eu corrigi para executar o programa. A menos que eu tenha cometido um erro ao executar seu código, as dimensões de algumas das imagens geradas estão incorretas (por exemplo,image2.txt
possui 33.164 bytes, masimage2-50.0.txt
possui 33.329) e outras não geram o mesmo arquivo ao executar os programas gerados (image3-50.0.txt
tem uma qualidade de 0,5110 , mas a execução do programa gerado resulta em uma qualidade de 0,4508 ).image3-50.0.py
do seu Dropbox e ele corresponde ao arquivo que eu gerei.