Ecrivez un programme qui prend une chaîne ou un fichier texte dont la première ligne a la forme
width height
et chaque ligne suivante a la forme
x y intensity red green blue
où:
width
etheight
peut être n'importe quel entier positif.x
ety
peuvent être des nombres entiers.intensity
peut être n'importe quel entier non négatif.red
,green
etblue
peuvent être des nombres entiers compris entre 0 et 255 inclus.
Votre programme doit générer une image truecolor dans n’importe quel format de fichier image sans perte commun dont les dimensions sont définies width
par height
. Chaque x y intensity red green blue
ligne représente une étoile ou un globe coloré à dessiner sur l’image. Il peut y avoir un nombre quelconque d'étoiles à dessiner, y compris 0. Vous pouvez supposer que la chaîne ou le fichier a une nouvelle ligne.
L'algorithme pour dessiner l'image est le suivant, mais vous pouvez l'implémenter à votre guise tant que le résultat est identique:
Pour chaque pixel ( X , Y ) de l’image ( X étant 0 au bord le plus à gauche et 1 à la largeur au bord le plus à droite, et Y à 0 au bord supérieur et à la hauteur 1 au bord inférieur), le canal de couleur C ϵ { rouge , vert , bleu } (une valeur épinglée entre 0 et 255) est donné par l'équation:
Où la fonction dist est soit une distance euclidienne :
Choisissez la fonction de distance que vous préférez, en fonction de la golfabilité ou de l'esthétique.
En plus de la première, chacune des lignes de l'entrée est un élément du jeu d' étoiles . Ainsi, par exemple, S x représente la
x
valeur sur l' une des lignes d'entrée, et S C représente soitred
,green
oublue
, selon le canal de couleur est en cours de calcul.
Exemples
Exemple A
Si l'entrée est
400 150
-10 30 100 255 128 0
la sortie devrait être
si vous utilisez la distance euclidienne, et
si vous utilisez la distance de Manhattan.
Exemple B
Si l'entrée est
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
les sorties respectives pour la distance euclidienne et Manhattan devraient être
et .
Exemple C
Si l'entrée est
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
la sortie devrait être
si vous utilisez la distance euclidienne, et
si vous utilisez la distance de Manhattan.
Exemple D
Si l'entrée est
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
la sortie devrait être
si vous utilisez la distance euclidienne, et
si vous utilisez la distance de Manhattan.
Exemple E
Si l'entrée est
100 1
la sortie devrait alors être une image complètement noire de 100 pixels de large par 1 pixel de haut.
Remarques
- Prenez la chaîne d'entrée ou le nom d'un fichier texte qui le contient à partir de stdin ou de la ligne de commande, ou écrivez une fonction prenant une chaîne.
- "Produire" l'image signifie soit:
- Sauvegarde dans un fichier avec le nom de votre choix.
- Impression des données de fichier image brutes sur stdout.
- Affichage de l'image, comme avec PIL de
image.show()
.
- Je ne vérifierai pas que vos images sont parfaitement pixelisées (Stack Exchange compresse néanmoins les images avec perte), mais je serai très suspicieux si je peux distinguer visuellement toute différence.
- Vous pouvez utiliser des bibliothèques de graphiques / d'images.
Gagnant
La soumission la plus courte en octets l'emporte. En cas d'égalité, la première soumission gagne.
Bonus amusant: donnez une entrée pour une image de sortie vraiment spectaculaire.