Escreva um programa que utilize uma string ou arquivo de texto cuja primeira linha tenha a forma
width height
e cada linha subseqüente tem a forma
x y intensity red green blue
Onde:
width
eheight
pode ser qualquer número inteiro positivo.x
ey
pode ser qualquer número inteiro.intensity
pode ser qualquer número inteiro não negativo.red
,,green
eblue
podem ser quaisquer números inteiros de 0 a 255, inclusive.
Seu programa deve produzir uma imagem TrueColor em qualquer formato de arquivo de imagem sem perdas comum cujas dimensões sejam width
de height
. Cada x y intensity red green blue
linha representa uma estrela ou esfera colorida que deve ser desenhada na imagem. Pode haver qualquer número de estrelas para desenhar, incluindo 0. Você pode assumir que a sequência ou o arquivo tem uma nova linha à direita.
O algoritmo para desenhar a imagem é o seguinte, embora você possa implementá-lo da maneira que desejar, desde que o resultado seja idêntico:
Para cada pixel ( X , Y ) na imagem (onde X é 0 na borda esquerda e largura-1 na borda direita e Y é 0 na borda superior e altura 1 na borda inferior), o canal de cores C ϵ { vermelho , verde , azul } (um valor fixado entre 0 e 255) é dado pela equação:
Onde a função dist é a distância euclidiana :
Escolha a função de distância que você preferir, com base na capacidade de golfe ou na estética.
Cada uma das linhas na entrada além da primeira é um elemento do conjunto de Estrelas . Assim, por exemplo, S x representa o
x
valor de uma das linhas de entrada, S e C representa oured
,green
oublue
, dependendo do que está a ser calculada canal de cor.
Exemplos
Exemplo A
Se a entrada for
400 150
-10 30 100 255 128 0
a saída deve ser
se você estiver usando a distância euclidiana e
se você estiver usando a distância de Manhattan.
Exemplo B
Se a entrada for
200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255
as respectivas saídas para distância Euclidiana e Manhattan devem ser
e .
Exemplo C
Se a entrada for
400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123
a saída deve ser
se você estiver usando a distância euclidiana e
se você estiver usando a distância de Manhattan.
Exemplo D
Se a entrada for
400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123
a saída deve ser
se você estiver usando a distância euclidiana e
se você estiver usando a distância de Manhattan.
Exemplo E
Se a entrada for
100 1
a saída deve ter uma imagem de 100 pixels de largura por 1 pixel de altura, completamente preta.
Notas
- Pegue a string de entrada ou o nome de um arquivo de texto que o contenha a partir de stdin ou da linha de comando, ou você pode escrever uma função que aceita uma string.
- "Saída" da imagem significa:
- Salvando-o em um arquivo com o nome de sua escolha.
- Imprimir os dados brutos do arquivo de imagem em stdout.
- Exibindo a imagem, como com PIL 's
image.show()
.
- Não vou verificar se as suas imagens são perfeitas em pixels (o Stack Exchange, com perdas, comprime imagens de qualquer maneira), mas ficarei muito desconfiado se conseguir distinguir visualmente alguma diferença.
- Você pode usar bibliotecas de imagens / gráficos.
Ganhando
O menor envio em bytes vence. Em caso de empate, a primeira apresentação vence.
Bônus de diversão: dê a entrada para uma imagem de saída verdadeiramente espetacular.
fonte
Respostas:
Pitão - 46 bytes
Isso foi divertido! Finalmente, usei os recursos de E / S da imagem do Pyth. Faz distância euclidiana por causa da golfiness, embora manhattan seja apenas uma pequena mudança.
Isso apenas percorre todos os pixels com a fórmula, apesar de condensar o loop de pixels em um loop e ser usado,
divmod
já que Pyth suporta apenas 3 mapas aninhados e os cálculos levam dois (um para RGB e outro para as estrelas).Salva a imagem como
o.png
. Muito devagar, faz os dois primeiros testes em menos de 2 minutos, mas os outros 2 duram cerca de meia hora.Há um bug noMesclado!.w
qual ninguém notou porque ninguém o usa;), mas eu fiz uma solicitação pull, então use meu fork para testar se não será mesclado em breve.Exemplos de saídas
Exemplo A
Exemplo B
Exemplo C
Exemplo D
fonte
JavaScript
394344Edit: reduziu muito o código aplicando as sugestões impressionantes de wolfhammer .
Teste
Nota: Aguarde alguns segundos para que o trecho abaixo seja renderizado (leva aproximadamente 4 segundos na minha máquina).
Mostrar snippet de código
Você também pode executá-lo no JSFiddle .
Bônus: Eclipse Azul
Você também pode executá-lo no JSFiddle .
Descrição
Esta é uma implementação simples da tela JavaScript + HTML5: uma função que utiliza um argumento de string (sem espaços à esquerda / novas linhas) e exibe a saída no DOM. Ele usa distância euclidiana.
Aqui está o código legível:
fonte
Java - 627 bytes
Java é realmente uma das melhores linguagens de golfe :)
Usando a entrada abaixo, você pode criar um modelo um tanto realista do nosso sistema solar (o tamanho de alguns planetas está errado, mas a distância entre eles deve ser precisa). Eu tentei dar anéis para Saturno, mas não funcionou ... Source
Imagem Full HD , que não parece ótima ... Ficaria feliz se alguém pudesse melhorá-la!
fonte
Bash,
147145 bytesImageMagick é usado para manipular imagens. A distância euclidiana é usada.
fonte
$w\x$h
.o=o.png
.Python 3, 189 bytes
Eu não sou a idéia de ninguém como um jogador experiente, mas aqui vai.
stdin
e vai parastdout
no formato PPM .python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm
Primeiro, Manhattan distância:
E segundo, a distância euclidiana:
Eu poderia salvar quatro bytes usando divisão inteira em vez de
int()
, e na verdade isso parece ser o que as imagens originais fazem - você mal consegue distinguir algumas estrias nas bordas escuras do brilho da estrela que não estão estritamente corretas código. No entanto, este código segue a descrição, não as imagens.A versão ungolfed, e meu golfe original antes das muitas otimizações que outros apontaram ou que eu tropecei em mim mesmo, estão nesta essência .
EDIT: salvei 7 bytes movendo
for x
-mefor y
para uma única funçãoprint
(ouo
), mas isso produz um arquivo PNM com uma linha muito longa, o que pode ou não causar alguns problemas.EDIT 2: Maltysen me salvou outros 20 bytes. Obrigado!
EDITAR novamente: agora que existe apenas um
print
, oo
alias é um passivo, não uma economia. Mais 4 bytes de desconto.Edite um pouco mais: o Sp3000 me salvou mais 2 bytes. Enquanto isso, aliasing
map
param
não salvar nada, por isso, no interesse da legibilidade (!), Expandi-lo novamente. Agora é uma boa rodada 2 8 bytes.EDITAR o último (?): Agora, com suporte à distância euclidiana - e abusando de números complexos, fiz exatamente no mesmo número de bytes!
EDIT, a reinicialização de Hollywood: a próxima sugestão do Sp3000 bateu 5 bytes.
EDIT, a sequência estupidamente nomeada: 6 bytes cortados, graças a uma sugestão que Maltysen fez que eu não entendi até o Sp3000 repeti-lo ... depois outros 8 bytes de
%
abuso. E falar no bate-papo derrubou um fenomenal2126 bytes. Estou humilhado.fonte
EOF
s, você pode usar ositer()
valores sentinel: docs.python.org/2/library/functions.html#iter asiter(raw_input,'')
, também colocarw,h,S
na mesma linha com a descompactação estendida.EOFError
(e, portanto, eu precisava de umtry
bloco), porque não há linha em branco no arquivo de entrada e não tenho certeza se o desafio me permite adicionar uma. Ou eu estou esquecendo de alguma coisa?stdin
não era um iterador.C ++, 272 bytes
Precisa de um compilador C ++ 11 brando (o GCC 4.9.2 é apenas um pouco insatisfeito) e a biblioteca png ++ , que ela mesma exige
libpng
. Distância de Manhattan usada. Ativa a entradastdin
e gera um arquivo chamado "a" no diretório atual no formato PNG.Exemplo D:
fonte
PCG
imagem :) (EmboraPPCG
é minha abreviatura preferido;))Python 2,
240232228 bytesUsa a distância de Manhattan. Provavelmente isso seria ainda mais curto no Python 3, mas estraguei meus pacotes Python recentemente e estou tendo problemas para reinstalar o Pillow. O PPM provavelmente seria ainda mais curto, mas eu gosto do PIL.
Por diversão, tentei aplicar o algoritmo como está no espaço de cores L * a * b * , pensando que daria uma melhor mistura de cores (especialmente no exemplo B). Infelizmente, o algoritmo de Calvin permite que os canais ultrapassem seus valores máximos, o que torna as imagens um pouco menos impressionantes do que eu esperava ...
fonte
Mathematica, 146 bytes
Uma função pura usando uma string. Para executá-lo em um período de tempo razoável, substitua o
1
in1+#~ManhattanDistance...
por a1.
; isso força a computação numérica em vez de simbólica.Ungolfed:
fonte
Python 2,
287251 bytesUma versão em golf do código original que usei para gerar as imagens. Provavelmente poderia ser jogado um pouco mais (por um jogador melhor do que eu). É uma função que recebe a string de entrada completa. Processamento de imagem realizado com o Módulo de Imagem da PIL . Usa a distância de Manhattan.
O uso da distância euclidiana é de 5 bytes a mais (256 bytes):
Aqui está um conjunto de testes completo que executa os exemplos A a E da pergunta, para as duas métricas de distância:
Todos eles parecem indistinguíveis. Os maiores podem levar alguns segundos para serem executados.
fonte
for x in r(I[0]):...for y in r(I[1]):
, alterando-o parafor x in r(I[0]*I[1]):
. Você pode reduzir cada nível de recuo dentro de 1 por 1 e substituirx
porx/I[1]
ey
comy%I[1]
.from PIL import Image
porfrom PIL import*
C, 247 bytes
Não vou ganhar, mas eu gosto de jogar golfe em C. Nenhuma biblioteca de imagens externa usada, gera stdout no formato PPM. Recebe entrada em stdin. Usa a distância de Manhattan para jogar golfe.
Aqui está a variante de distância euclidiana (257 bytes):
fonte
CJam, 86 bytes
Embora isso pareça meio demorado para um idioma de golfe, acredito que, das soluções postadas até agora, é a mais curta que não usa a funcionalidade de saída de imagem. Isso produz um arquivo PPM no formato ASCII. A imagem abaixo foi convertida de PPM para PNG usando o GIMP.
Não recomendo executar o código no interpretador CJam online. Pelo menos não para as imagens em tamanho real. Meu navegador travou, provavelmente por causa do uso de memória. Ele completa as imagens de 400x400 no segundo intervalo com a versão offline.
Explicação:
fonte
Bytes em C # 718
Sei que c # é terrível para o golfe, mas aqui está a minha tentativa de 718 bytes
Se alguém tiver alguma sugestão para encurtá-lo, entre em contato.
fonte
Python, 259 bytes
Finalmente pronto! Primeiro código de golfe que experimentei, decidi usar Python e segui a distância de Manhattan. Shoutout to Maltysen por me ajudar com os iteradores, reduziu o tamanho total para quase a metade!
fonte
k[0]
ek[1]
nos cálculos.CJam, 70 bytes
Distância euclidiana, saída ASCII PPM. Experimente online
Deve ser possível espremer mais alguns bytes, mas não quero gastar muito tempo.
fonte