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.