Pour une image comportant uniquement des pixels noirs et blancs et un emplacement (x, y) qui est un pixel blanc, colorez les pixels blancs en fonction de leur distance minimale de Manhattan à partir de (x, y) dans un tracé qui implique uniquement de traverser d'autres pixels blancs.
La teinte des pixels colorés doit être proportionnelle à leur distance par rapport à (x, y). Ainsi, le pixel situé en (x, y) aura une teinte de 0 ° (rouge pur) et les pixels les plus éloignés de (x, y). aura une teinte de 360 ° (également rouge), avec les autres teintes se mélangeant de manière transparente et linéaire entre les deux. La saturation et la valeur doivent être toutes deux 100%.
Si un pixel blanc n'est pas connecté à (x, y) via d'autres pixels blancs, il doit rester blanc.
Détails
- L'entrée consistera en le nom de fichier de l'image ou des données d'image brutes, plus les entiers x et y.
- L'image de sortie peut être enregistrée dans un fichier ou transférée brute sur stdout dans n'importe quel format de fichier d'image commun, ou simplement affichée.
- La valeur x est 0 sur les pixels les plus à gauche et augmente en allant à droite. La valeur y est 0 dans les pixels les plus élevés et augmente en descendant. (x, y) sera toujours dans les limites de l'image.
- Les programmes complets et les fonctions sont autorisés.
Le code le plus court en octets gagne.
Exemples
Toutes ces images ont été réduites pour gagner de la place. Cliquez dessus pour voir en taille réelle.
Image d'entrée:
(x,y) = (165,155)
et (x,y) = (0,0)
Image d'entrée et sortie avec (x,y) = (0,0)
:
Image d'entrée et sortie avec (x,y) = (600,350)
:
Image d'entrée et sortie avec (x,y) = (0,0)
:
Image d'entrée et sortie avec (x,y) = (0,0)
:
Bonus optionnel de -30%: utilisez la distance euclidienne. Une suggestion pour votre algorithme est la suivante (aperçu général):
- Avoir un pixel de départ.
- Remplir de ce pixel.
- Pour chaque pixel atteint dans le remplissage d'inondation,
- Déplacez le pixel de départ vers ce pixel par demi-unités, en ligne droite.
- À chaque étape, appliquez
int()
les coordonnées x et y. Si le pixel à ces coordonnées est noir, arrêtez. Sinon, continuez. (Ceci est une méthode en ligne de mire.) - Tout pixel atteint qui borde un pixel blanc et / ou un pixel précédemment étiqueté avec une distance beaucoup plus grande (+10) devient un pixel de départ.
Dans un sens plus méta, cet algorithme se propage à chaque pixel accessible en ligne droite à partir des pixels de départ / déjà colorés, puis en "pouces" autour des bords. Le bit "distance significativement plus élevée" est destiné à accélérer l'algorithme. Honnêtement, peu importe la manière dont vous mettez en œuvre la distance euclidienne, cela doit ressembler beaucoup à ceci.
Voici à quoi ressemble le premier exemple avec la distance euclidienne, en utilisant l'algorithme ci-dessus:
Image d'entrée et (x,y) = (165,155)
Merci beaucoup à Calvin'sHobbies et à Trichoplax d’avoir aidé à écrire ce défi! S'amuser!