Scrivi un programma che contiene una stringa o un file di testo la cui prima riga ha il modulo
width height
e ogni riga successiva ha il modulo
x y intensity red green blue
dove:
width
eheight
può essere qualsiasi numero intero positivo.x
ey
può essere qualsiasi numero intero.intensity
può essere qualsiasi numero intero non negativo.red
,green
eblue
possono essere numeri interi compresi tra 0 e 255 inclusi.
Il tuo programma deve produrre un'immagine truecolor in qualsiasi formato di file immagine lossless comune le cui dimensioni sono width
di height
. Ogni x y intensity red green blue
linea rappresenta una stella o un globo colorato che deve essere disegnato sull'immagine. È possibile disegnare un numero qualsiasi di stelle, incluso 0. Puoi supporre che la stringa o il file abbia una nuova riga finale.
L'algoritmo per disegnare l'immagine è il seguente, sebbene tu possa implementarlo come preferisci purché il risultato sia identico:
Per ogni pixel ( X , Y ) nell'immagine (dove X è 0 sul bordo più a sinistra e larghezza-1 sul bordo più a destra, e Y è 0 sul bordo superiore e altezza-1 sul bordo inferiore), il canale del colore C ϵ { rosso , verde , blu } (un valore compreso tra 0 e 255) è dato dall'equazione:
Dove la funzione dist è la distanza euclidea :
Scegli la funzione di distanza che preferisci, in base alla golfabilità o all'estetica.
Ciascuna delle linee nell'input oltre alla prima è un elemento dell'insieme di stelle . Così, per esempio, S x rappresenta il
x
valore su una delle linee di ingresso e S C rappresenta ored
,green
oblue
, a seconda di quale canale di colore viene attualmente calcolato.
Esempi
Esempio A
Se l'ingresso è
400 150
-10 30 100 255 128 0
l'output dovrebbe essere
se stai usando la distanza euclidea, e
se stai usando la distanza di Manhattan.
Esempio B
Se l'ingresso è
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
le rispettive uscite per la distanza euclidea e Manhattan dovrebbero essere
e .
Esempio C
Se l'ingresso è
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
l'output dovrebbe essere
se stai usando la distanza euclidea, e
se stai usando la distanza di Manhattan.
Esempio D
Se l'ingresso è
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
l'output dovrebbe essere
se stai usando la distanza euclidea, e
se stai usando la distanza di Manhattan.
Esempio E
Se l'ingresso è
100 1
quindi l'output dovrebbe essere un'immagine di 100 pixel di larghezza per 1 pixel di altezza completamente nera.
Appunti
- Prendi la stringa di input o il nome di un file di testo che lo contiene da stdin o dalla riga di comando, oppure potresti scrivere una funzione che accetta una stringa.
- "Emissione" dell'immagine significa:
- Salvandolo in un file con il nome desiderato.
- Stampa dei dati del file di immagine non elaborati su stdout.
- Visualizzazione dell'immagine, come ad esempio con PIL 's
image.show()
.
- Non verificherò che le tue immagini siano pixel perfetti (Stack Exchange comprime comunque le immagini in modo perdita) ma sarò molto sospettoso se posso dire visivamente qualsiasi differenza.
- È possibile utilizzare librerie di grafica / immagini.
vincente
Vince l'invio più breve in byte. In caso di parità vince la prima domanda.
Divertente bonus: dai l'input per un'immagine di output davvero spettacolare.