Schreiben Sie ein Programm oder eine Funktion, die die folgende Eingabe in einem angemessenen Format Ihrer Wahl aufnimmt:
Zwei positive ganze Zahlen W und H, die die Breite und Höhe des zu erzeugenden Bildes definieren.
Zwei RGB-Farben C1 und C2, mit denen das Bild eingefärbt wird.
Eine Liste von 3 Tupeln des Formulars
(r, x, y)
, die Kreise mit Radiusr
und Mittelpunktx, y
in der Bildebene definieren .r
ist eine positive ganze Zahl undx
undy
sind beliebige ganze Zahlen. Das obere linke Pixel des Bildes ist0, 0
und die x-Achse steigt nach rechts und die y-Achse steigt nach unten.
Geben Sie ein Bild mit den Abmessungen W bis H aus, das mit C1 und C2 so gefärbt ist, dass keine zwei benachbarten Bereiche, die durch alle überlappenden Kreise definiert sind, die gleiche Farbe haben.
Zum Beispiel: Wenn die Eingabe ist
W = 300 H = 200 C1 = (255, 200, 0) C2 = (128, 0, 255) Circles = (25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)
dann sehen die Kreisgrenzen so aus:
In dem von den Kreisen erzeugten Bild gibt es sechs verschiedene, zusammenhängende Bereiche. Jede Region muss mit C1 (gelb) oder C2 (lila) so gefärbt sein, dass keine zwei benachbarten Regionen dieselbe Farbe haben.
Hierfür gibt es zwei Möglichkeiten. Der einzige Unterschied besteht darin, dass die Farben vertauscht werden:
Somit wäre jedes dieser beiden Bilder eine gültige Ausgabe für die Beispieleingabe.
So etwas wie dies wäre ungültig Ausgabe seit zwei gelben Regionen Nachbarn einander.
Ihre Ausgabebilder sollten diesen Richtlinien entsprechen:
Neben C1 und C2 kann eine dritte neutrale Farbe wie Schwarz oder Weiß für Kreisgrenzen verwendet werden, sofern sie nicht dicker als 5 Pixel sind. (Im obigen Beispiel sind schwarze, 1 Pixel dicke Grenzen vorhanden.)
Kreisgrenzen sind jedoch nicht erforderlich. Die Regionen können direkt benachbart sein:
Beides ist eine weitere gültige Ausgabe des obigen Beispiels.
Kreise sollten so genau wie möglich sein, wobei Kreiszeichnungsalgorithmen oder was auch immer Ihre Grafikbibliothek bereitstellt, verwendet werden.
Im Allgemeinen ist keine Pixel-Perfektion erforderlich, aber wenn die Eingabeparameter immer größer skaliert werden, sollte das resultierende Bild immer genauer werden.
Anti-Aliasing ist zulässig, aber nicht erforderlich.
Gitternetzlinien, Achsenbeschriftungen usw. im Hintergrund sind nicht zulässig.
Der kürzeste Code in Bytes gewinnt.
Mehr Beispiele
Alle verwenden diese Eingaben mit verschiedenen Kreisen:
W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
In jedem Beispiel können die Farben getauscht werden und bleiben gültig.
Circles =
A. empty list
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
A.
B.
C.
D.
E.
F.
G.
H.
I.
J.
K.
L.
Stellen Sie sicher, dass sich Ihre Ausgabe ähnlich wie in diesen Beispielen verhält.
quelle
tikz
Antworten:
Mathematica, 165 Bytes
Reine Funktion mit vier Argumenten: der Breite, der Höhe (beide Ganzzahlen), einem geordneten Zahlenpaar zwischen 0 und 1 (das die beiden RGB-Farben darstellt) und einer Liste von Elementen der Form
{r, {x, y}}
zur Aufzeichnung der Radien und Mitten von die Kreise. Beispielsweise würde das erste Beispiel im OP mit den Argumenten aufgerufen[300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]
. Die positive y-Achse zeigt in Mathematica nach oben.Norm[{x,y}-#2]<#
erkennt, ob sich ein Punkt innerhalb eines gegebenen Kreises befindet;Boole[...]Pi
konvertiert dasTrue
oderFalse
zuπ
oder0
. Nachdem Sie diese πs / 0s über alle Eingabekreise berechnet haben, addierenTr
Sie sie undCos
konvertieren Sie gerade Vielfache von π zu 1, ungerade Vielfache von π zu –1.ContourPlot[...,Contours->{0}]
Färbt dann den entsprechenden Bereich der Ebene in zwei Farben, je nachdem, ob der Wert größer oder kleiner als ist0
.AspectRatio->Automatic
lässt Kreise wie Kreise aussehen;PlotPoints->5!
gibt eine anständige Genauigkeit (steigern Sie es auf,9!
wenn Sie wirklich ein erstaunliches Bild wollen, weit in der Zukunft!);Frame->False
beseitigt die Äxte; undContourShading->RGBColor@@@#3
verwendet die Eingabefarben für die Konturen.Beispielausgabe mit dem ersten Farbpaar (da sie nett sind), aber der letzten Gruppe von Kreisen:
quelle
JavaScript / SVG / HTML5, 219 Byte
quelle
BBC Basic,
120117 BytesLaden Sie den Interpreter unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter
BBC Basic verfügt über eine Reihe von Farbmodi, mit denen Sie Rastergrafiken gemäß den grundlegenden Logikoperationen zeichnen können: ODER, UND, XOR usw.
Es unterstützt auch die Neuprogrammierung von Paletten, dh, hier können die Farben eines zweifarbigen Bildes auf eine von 4096 Farben neu programmiert werden. Die hier verwendete Implementierung weist einige (undokumentierte) Unterschiede zur ursprünglichen BBC-Implementierung auf, bei der die EOR-Operatoren nicht erforderlich wären.
Ungolfed
Typischer Ausgabebildschirm
Beispielbild, um den Faktor 10 in Einheiten / Faktor 5 in Pixeln vergrößert (BBC basic verwendet 1 Pixel = 2 Einheiten.)
quelle
MATL ,
302925 BytesEingabeformat:
Probieren Sie es bei MATL Online! Oder überprüfen Sie den letzten Testfall . (Der Interpreter ist noch experimentell. Möglicherweise müssen Sie die Seite aktualisieren und es erneut versuchen, wenn es nicht funktioniert.)
Erläuterung
Der Code verwendet komplexe Zahlen, um das Gitter von Punkten zu definieren und Entfernungen zu berechnen, und verwendet Array-Operationen beim Rundsenden in hohem Maße .
quelle
Python mit Pypng ,
140138 BytesAnwendungsbeispiel:
Danke an xnor für das Speichern von 2 Bytes.
quelle
abs(x-X+1j*(y-Y))<r
.Mathe (nicht wettbewerbsfähig)
(idk wie man LaTeX in PPCG macht, also habe ich ein LaTeX to png Tool benutzt)
Erläuterung
Das Produkt mehrerer Kreisgleichungen (
(x-a)^2+(y-b)^2-r^2
)> = 0 ergibt ein Diagramm, das diese Frage benötigt. In der Gleichungn
ist die Größe des Arrays und(x, y or r)_k
ist dask
th-(x, y, or r)
Element.Beispiel
(0,0,2),(2,2,2)
(Ungleichungsplot von WolframAlpha)
Gleichung für WolframAlpha abrufen / ausführen
Code-Snippet anzeigen
Lass es jetzt mit Mathematica funktionieren ...
quelle
Python 2.x,
166158Die Funktion erzeugt eine PPM-Datei auf der Standardausgabe.
Beispiel:
quelle
Common Lisp + Quicklisp + ZPNG 260 + 20 = 280 Zeichen
Dies ist einer der umfangreichsten Codes, die ich jemals in CL geschrieben habe. Wenn ich keinen Code-Golf gespielt hätte, hätte ich dies umstrukturiert, um das Lesen zu vereinfachen ...
Vorspiel (20 Zeichen)
Golf (260 Zeichen)
Ungolfed:
(Verwendet Defun, um Tests und längere Variablennamen für die Lesbarkeit zu ermöglichen.)
Beispiel Verwendung:
Erklärung
Gibt true zurück, wenn der Punkt (i, j) innerhalb des angegebenen Kreises circ liegt. Der euklidische Abstand wird berechnet, indem der Absolutwert der komplexen Zahl, die den Vektor von (i, j) zum Mittelpunkt des Kreises darstellt, genommen wird.
Ordnen Sie diese Funktion in der Kreisliste zu und prüfen Sie, ob der angegebene Punkt (i, j) in eine gerade Anzahl von Kreisen fällt.
Wählen Sie die Farbe basierend auf diesem Test.
Sammeln Sie eine flache Liste aller RGB-Bytes, indem Sie alle (i, j) im Bild durchlaufen und die resultierenden Listen zusammenfügen.
Konvertieren Sie diese Liste von Bytes in ein geeignetes Array von Bytes, damit zpng sie richtig aufnehmen kann.
Erstellen Sie das PNG-Objekt.
Erstellen Sie die Funktion, um die Breite, Höhe, zwei Farben und die Liste der Kreise zu übernehmen und das erstellte PNG-Objekt zurückzugeben.
quelle
JavaScript (ES6), 224 Byte
Ich habe die JS + SVG-Lösung gesehen, musste aber nur eine Canvas-basierte Lösung erstellen ;-) Dies ist eine Funktion, die ein Canvas-Element zurückgibt. Wenn ein vorhandenes Zeichenflächenelement bereitgestellt werden kann, entfernen Sie 40 Byte.
Rufen Sie gerne an
f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])
Beispielausgabe:
quelle
Löve2D , 353 Bytes.
quelle