Bei einem Bild mit nur schwarzen und weißen Pixeln und einer (x, y) -Position, die ein weißes Pixel ist, färben Sie die weißen Pixel basierend auf ihrem minimalen Manhattan-Abstand von (x, y) in einem Pfad, bei dem nur andere weiße Pixel durchlaufen werden.
Der Farbton der farbigen Pixel muss proportional zu ihrem Abstand von (x, y) sein, damit das Pixel bei (x, y) einen Farbton von 0 ° (reines Rot) hat und die Pixel am weitesten von (x, y) entfernt sind. hat einen Farbton von 360 ° (auch rot), wobei die anderen Farbtöne nahtlos und linear dazwischen übergehen. Die Sättigung und der Wert müssen beide 100% betragen.
Wenn ein weißes Pixel nicht über andere weiße Pixel mit (x, y) verbunden ist , muss es weiß bleiben.
Einzelheiten
- Die Eingabe besteht aus dem Dateinamen des Bildes oder den Rohbilddaten sowie den Ganzzahlen x und y.
- Das Ausgabebild kann in einer Datei gespeichert oder in einem beliebigen gängigen Bilddateiformat als Pipe-Rohdatei ausgegeben oder einfach angezeigt werden.
- Der x-Wert ist 0 für die am weitesten links liegenden Pixel und steigt nach rechts. Der y-Wert ist in den obersten Pixeln 0 und steigt nach unten. (x, y) befindet sich immer innerhalb der Bildgrenzen.
- Es sind sowohl vollständige Programme als auch Funktionen zulässig.
Der kürzeste Code in Bytes gewinnt.
Beispiele
Alle diese Bilder wurden aus Platzgründen verkleinert. Klicken Sie auf die Bilder, um sie in voller Größe anzuzeigen.
Eingabebild:
(x,y) = (165,155)
und (x,y) = (0,0)
Eingabebild und Ausgabe mit (x,y) = (0,0)
:
Eingabebild und Ausgabe mit (x,y) = (600,350)
:
Eingabebild und Ausgabe mit (x,y) = (0,0)
:
Eingabebild und Ausgabe mit (x,y) = (0,0)
:
Optional -30% Bonus: Verwenden Sie die euklidische Distanz. Ein Vorschlag für Ihren Algorithmus lautet wie folgt (allgemeine Gliederung):
- Habe ein Startpixel.
- Fülle es von diesem Pixel aus.
- Für jedes Pixel, das in der Überflutungsfüllung erreicht wird,
- Bewegen Sie sich in Schritten von einer halben Einheit in einer geraden Linie von dem Startpixel zu diesem Pixel.
- Wenden Sie bei jedem Schritt
int()
die x- und y-Koordinaten an. Wenn das Pixel an diesen Koordinaten schwarz ist, halten Sie an. Andernfalls fahren Sie fort. (Dies ist eine Sichtlinienmethode.) - Jedes erreichte Pixel, das an ein weißes Pixel angrenzt, und / oder ein Pixel, das zuvor mit einem signifikant höheren Abstand (dh +10) gekennzeichnet war, wird zu einem Startpixel.
In einem metaeren Sinn breitet sich dieser Algorithmus auf jedes Pixel aus, das in einer geraden Linie von den anfänglichen / bereits gefärbten Pixeln aus erreichbar ist, und dann "Zoll" um die Kanten herum. Das Bit "signifikant höherer Abstand" soll den Algorithmus beschleunigen. Ehrlich gesagt spielt es keine Rolle, wie Sie die euklidische Distanz implementieren, es muss nur so aussehen.
So sieht das erste Beispiel mit euklidischer Distanz aus, wobei der obige Algorithmus verwendet wird:
Eingabebild und (x,y) = (165,155)
Vielen Dank an Calvin'sHobbies und Trichoplax für die Unterstützung beim Schreiben dieser Herausforderung! Habe Spaß!
quelle
Antworten:
Matlab,
255 245231 BytesDies erwartet zuerst den Bildnamen
y
und dannx
.Ich habe die Überflutungsfüllung (oder 'dijkstra for 4-neighborhoods', wenn Sie möchten) grob implementiert, indem ich zuerst eine Maske erstellt habe, in der das Startbildelement auf 1 gesetzt ist, und einen Abstandsakkumulator (beide Bildgrößen) verwendet und dann die folgenden Schritte wiederholt habe Schritte:
k
k
Dies lässt uns die Manhattan-Abstände von jedem Pixel zu dem Startpixel in dem Abstandsakkumulator. Dann erstellen wir ein neues Bild, indem wir den vorgegebenen Farbbereich durchlaufen und den "ersten" Farbton auf den Wert Null und den "letzten" Farbton auf den maximalen Abstand abbilden.
Beispiele
Als Bonus hier ein hübsches Bild, wie die Distanz berechnet wird. heller = weiter weg.
quelle
Blitz 2D / 3D , 3068 × 0,7 = 2147,6
Dies ist die Referenzimplementierung für den euklidischen Algorithmus Golfed.
Eigentlich hasse ich es, wie unleserlich dies im Vergleich zum Original ist. (Das sind übrigens 5305 Bytes.) Eigentlich könnte ich ein paar Bytes mehr wegschneiden, indem ich für alles einstellige Variablennamen verwende, aber das ist schon lächerlich genug. Und es wird nicht so bald gewinnen. : P
quelle
C ++ / SFML:
127112351226 Bytes-36 Bytes dank user202729 -9 Bytes dank Zacharý
Der
sf::Image
Parameter ist auch die Ausgabe (wird geändert). Du kannst es so benutzen:Der erste Parameter ist die Bildeingabe (und -ausgabe), der zweite und der dritte Parameter sind die Parameter
x
undy
, bei denen sie beginnen müssenquelle
setPixel(j, i,hsv2
undFI(xm,ym) (std::find_if
wirklich notwendig?G(d,a,b,c)
und entfernencase d:
. Auch der Abstand zwischencase d:
undreturn C(a,b,c)
ist nicht erforderlich.(b>m?b:m)
erfordert keine Klammern und(t/60)%6
=>t/60%6
nach Operationsreihenfolge.xm
undym
zu kürzeren VariablennamenG(d,a,b,c)
undcase
,FI
,ti
undhsv2rgb
kann jeweils mit einem kürzeren Namen ersetzt werden.C ++,
979 969 898 859848 BytesRGBARGB-Datendatei( Ausgabe in Datei: d)Nicht gerade ein direkter "ungolf", aber dies war ein C-Prototyp, den ich zuerst verspottet habe:
Viele Konzepte bleiben ähnlich, aber es gibt sicherlich unzählige kleine Änderungen. Um dies als C zu kompilieren, müssen Sie C11 verwenden (C99 wird wahrscheinlich funktionieren, aber ich habe es nur in C11 streng getestet).
Ich habe diese Herausforderung sehr genossen, danke, dass du mir die Idee gegeben hast, etwas Neues auszuprobieren :).
Edit: Golf wäre ein bisschen besser.
Edit2: Zwei Strukturen wurden zusammengeführt, so dass meine Pixelstruktur und Warteschlange identisch sind, ein bisschen mehr Makromissbrauch und die Verwendung von 255 als -1 definiert werden können, wenn eine Reihe von Zeichen ohne Vorzeichen definiert wird. Zuletzt wurde ein Funktionsaufruf entfernt.
Edit3: Wiederverwendung einiger weiterer Variablen, Optimierung der Operatorpräzision und Konvertierung der Ausgabe in RGB, wobei der Alpha-Kanal
gespeichert wird.
quelle
Python 3 und Matplotlib, 251 Bytes
Die Eingabe ist ein MxNx3-Numpy-Array, wie es von der matplotlib-
imshow()
Funktion zurückgegeben wird. Die Eingabe wird von der Funktion so geändert, dass sie vorher kopiert werden sollte. Es zeigt das Bild automatisch an, wenn sich matplotlib im "interaktiven" Modus befindet. Andernfalls sollte ein Aufrufshow()
für weitere 7 Byte hinzugefügt werden.Die Ausgabe wird erstellt, indem zuerst das Originalbild und dann das darüberliegende Regenbogenbild angezeigt werden. Matplotlib behandelt inf und nan praktisch als transparent, sodass das Schwarzweißbild durchscheint.
quelle