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!
la source
Réponses:
Matlab,
255 245231 octetsCela attend le nom de l'image en premier, puis
y
, puisx
.J'ai implémenté le remplissage par inondation (ou «dijkstra pour 4 quartiers» si vous le souhaitez) en créant d'abord un masque où le pixel de départ est défini sur 1 et avec un accumulateur de distance (à la fois de la taille de l'image) et en répétant ensuite pas:
k
k
Cela nous laisse avec les distances de manhattan de chaque pixel jusqu'au pixel d'origine dans l'accumulateur de distance. Ensuite, nous créons une nouvelle image en parcourant la plage de couleurs donnée et en mappant la "première" teinte à la valeur zéro et la "dernière" teinte à la distance maximale.
Exemples
En prime, voici une jolie image de la manière dont la distance est calculée. plus lumineux = plus loin.
la source
Blitz 2D / 3D , 3068 * 0,7 = 2147,6
Ceci est l'implémentation de référence de l'algorithme euclidien, golfed.
En fait, je déteste à quel point cela est illisible par rapport à l'original. (Ce qui est, par ailleurs, 5305 octets.) En fait, je pourrais supprimer encore quelques octets en utilisant des noms de variable à un caractère pour tout, mais c'est déjà assez ridicule. Et ce n'est pas gagner de sitôt. : P
la source
C ++ / SFML:
127112351226 octets-36 octets grâce à user202729 -9 octets grâce à Zacharý
Le
sf::Image
paramètre est également la sortie (sera modifié). Vous pouvez l'utiliser comme ça:Le premier paramètre est l'image d'entrée (et de sortie), les deuxième et troisième paramètres sont les paramètres
x
ety
où il doit commencerla source
setPixel(j, i,hsv2
etFI(xm,ym) (std::find_if
vraiment nécessaire?G(d,a,b,c)
etcase d:
. En outre, l'espace entrecase d:
etreturn C(a,b,c)
est également inutile.(b>m?b:m)
ne nécessite pas les parenthèses, et(t/60)%6
=>t/60%6
par ordre d'opération.xm
etym
G(d,a,b,c)
etcase
,FI
,ti
ethsv2rgb
peuvent chacun être remplacé par un nom plus court.C ++,
979 969 898 859848 octetsRGBA(sortie dans le fichier: d)Ce n'est pas exactement un "ungolf" direct, mais c'était un prototype en C que je me suis d'abord maquillé:
De nombreux concepts restent similaires, mais il y a certainement une myriade de changements minimes. Pour compiler cela en tant que C, vous devez utiliser C11 (C99 fonctionnera probablement, mais je n’ai testé strictement que dans C11).
J'ai vraiment apprécié ce défi, merci de m'avoir donné l'idée d'essayer quelque chose de nouveau :).
Edit: Golf serait un peu mieux.
Edit2: Fusion de deux structures pour que ma structure et ma file de pixels soient identiques, un peu plus de macro-abus et des utilisations de 255 telles que l'on puisse la définir en tant que -1 lors de la définition d'une série de caractères non signés, et enfin supprimer un appel de fonction.
Edit3: Réutilisation de quelques variables supplémentaires, ajustements de la priorité des opérateurs et sortie convertie au
format RVB en enregistrant le canal alpha Edit4: Je pense que j'en ai terminé avec cela, quelques modifications arithmétiques de pointeur et de légers ajustements du flux de contrôle.
la source
Python 3 et matplotlib, 251 octets
L'entrée est un tableau numpy MxNx3 renvoyé par la
imshow()
fonction matplotlib . L'entrée est modifiée par la fonction, elle doit donc être copiée au préalable. Il affiche automatiquement l'image si matplotlib est en mode "interactif"; sinon, un appel àshow()
devrait être ajouté pour 7 octets supplémentaires.La sortie est créée en affichant d'abord l'image d'origine, puis en superposant l'image arc-en-ciel. Matplotlib traite idéalement inf et nan comme étant transparent, de sorte que l'image en noir et blanc transparaisse.
la source