Napisz program lub funkcję, która przyjmuje następujące dane wejściowe w rozsądnym wybranym formacie:
Dwie dodatnie liczby całkowite W i H, które określają szerokość i wysokość generowanego obrazu.
Dwa kolory RGB C1 i C2, które zostaną użyte do pokolorowania obrazu.
Lista 3-krotek formularza,
(r, x, y)
które definiują koła o promieniur
i środkux, y
w płaszczyźnie obrazu.r
jest dodatnią liczbą całkowitąx
iy
są dowolnymi liczbami całkowitymi. Lewy górny piksel obrazu jest,0, 0
a oś x zwiększa się w prawo, a oś y zwiększa się w dół.
Wyjście obrazu o wymiarach W przez H, który jest zabarwiony za pomocą C1 i C2 w taki sposób, że żadne dwa sąsiednie regiony zdefiniowane przez wszystkie nakładające się koła nie są tego samego koloru.
Na przykład: Jeśli dane wejściowe to
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)
wtedy granice okręgu wyglądają tak:
Na obrazie utworzonym przez kręgi znajduje się sześć odrębnych, ciągłych regionów. Każdy region musi być zabarwiony za pomocą C1 (żółty) lub C2 (fioletowy), aby żadne dwa sąsiednie regiony nie były tego samego koloru.
Można to zrobić na dwa sposoby, a jedyną różnicą jest zamiana kolorów:
Zatem każdy z tych dwóch obrazów byłby prawidłowym wyjściem dla przykładowego wejścia.
Coś jak to byłoby nieważne wyjście ponieważ dwie żółte regionów sąsiada siebie.
Obrazy wyjściowe powinny być zgodne z następującymi wskazówkami:
Oprócz C1 i C2 można zastosować trzeci, neutralny kolor, taki jak czarny lub biały, do granic okręgu, o ile nie mają one więcej niż 5 pikseli grubości. (Czarne granice o grubości 1 piksela są obecne w powyższym przykładzie).
Granice kręgów nie są jednak wymagane. Regiony mogą sąsiadować bezpośrednio:
Oba są kolejnymi prawidłowymi danymi wyjściowymi do powyższego przykładu.
Koła powinny być tak dokładne, jak to możliwe, przy użyciu algorytmów rysowania okręgów lub czegokolwiek, co zapewnia biblioteka graficzna.
Zasadniczo perfekcja pikseli nie jest wymagana, ale jeśli parametry wejściowe są skalowane jednakowo coraz bardziej, otrzymany obraz powinien być coraz bardziej dokładny.
Wygładzanie jest dozwolone, ale nie wymagane.
Linie siatki lub etykiety osi itp. W tle są niedozwolone.
Najkrótszy kod w bajtach wygrywa.
Więcej przykładów
Wszystkie używają tych danych wejściowych z różnymi zestawami kół:
W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
W każdym przykładzie kolory mogą być zamieniane i pozostają ważne.
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.
Upewnij się, że dane wyjściowe zachowują się podobnie do wszystkich tych przykładów.
źródło
tikz
Odpowiedzi:
Mathematica, 165 bajtów
Czysta funkcja pobierająca cztery argumenty: szerokość, wysokość (obie liczby całkowite), uporządkowaną parę trójek liczb od 0 do 1 (reprezentujących dwa kolory RGB) oraz listę elementów formularza
{r, {x, y}}
do rejestrowania promieni i środków koła Na przykład pierwszy przykład w PO zostałby wywołany z argumentami[300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]
. Dodatnia oś Y wskazuje w górę w Mathematica.Norm[{x,y}-#2]<#
wykrywa, czy punkt znajduje się w danym okręgu;Boole[...]Pi
konwertuje toTrue
lubFalse
naπ
lub0
. Po obliczeniu πs / 0s we wszystkich okręgach wejściowych,Tr
dodaje je iCos
konwertuje parzyste wielokrotności π na 1, nieparzyste wielokrotności π na –1.ContourPlot[...,Contours->{0}]
następnie koloruje odpowiedni obszar płaszczyzny w dwóch kolorach w zależności od tego, czy wartość jest większa czy mniejsza niż0
.AspectRatio->Automatic
sprawia, że koła wyglądają jak koła;PlotPoints->5!
daje przyzwoitą dokładność (zwiększ ją,9!
jeśli naprawdę chcesz niesamowitego obrazu w dalekiej przyszłości!);Frame->False
pozbywa się osi; iContourShading->RGBColor@@@#3
używa kolorów wejściowych dla konturów.Przykładowe dane wyjściowe z pierwszą parą kolorów (ponieważ są ładne), ale ostatnim zestawem kół:
źródło
JavaScript / SVG / HTML5, 219 bajtów
źródło
BBC Basic,
120117 bajtówPobierz tłumacza na http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
BBC Basic ma szereg trybów kolorów, umożliwiających kreślenie grafiki rastrowej zgodnie z podstawowymi operacjami logicznymi: OR, AND, XOR itp.
Obsługuje również przeprogramowanie palet, co oznacza, że na przykład tutaj obraz dwukolorowy może zostać przeprogramowany na dowolny z 4096 kolorów. Zastosowana tutaj implementacja ma pewne (nieudokumentowane) różnice w stosunku do oryginalnej implementacji BBC, w których operatorzy EOR nie byliby potrzebni.
Nie golfił
Typowy ekran wyjściowy
Przykładowy obraz powiększony o współczynnik 10 w jednostkach / współczynnik 5 w pikselach (BBC basic używa 1 piksela = 2 jednostki).
źródło
MATL ,
302925 bajtówFormat wejściowy:
Wypróbuj w MATL Online! Lub sprawdź ostatni przypadek testowy . (Tłumacz jest nadal w fazie eksperymentalnej. Może być konieczne odświeżenie strony i spróbuj ponownie, jeśli nie działa).
Wyjaśnienie
Kod używa liczb zespolonych do definiowania siatki punktów i obliczania odległości oraz intensywnie wykorzystuje operacje tablicowe z rozgłaszaniem .
źródło
Python używający pypng ,
140138 bajtówPrzykładowe użycie:
Dzięki xnor za zapisanie 2 bajtów.
źródło
abs(x-X+1j*(y-Y))<r
.Matematyka (nie konkuruje)
(idk jak zrobić LaTeX w PPCG, więc użyłem narzędzia LaTeX do png)
Wyjaśnienie
Iloczyn równań wielokrotnych okręgu (
(x-a)^2+(y-b)^2-r^2
)> = 0 utworzy wykres, którego potrzebuje to pytanie. W równaniun
jest rozmiarem tablicy i(x, y or r)_k
jestk
th(x, y, or r)
elementem.Przykład
(0,0,2),(2,2,2)
(Wykres nierówności autorstwa WolframAlpha)
Pobierz / Uruchom równanie dla WolframAlpha
Pokaż fragment kodu
Teraz spraw, aby działał z Mathematica ...
źródło
Python 2.x,
166158Funkcja generuje plik PPM na standardowym wyjściu.
przykład:
źródło
Common Lisp + Quicklisp + ZPNG 260 + 20 = 280 znaków
Jest to jeden z najszerszych kodów, jakie kiedykolwiek napisałem w CL, a gdybym nie grał w golfa kodowego, zrestrukturyzowałbym to, aby ułatwić czytanie ...
Preludium (20 znaków)
Gra w golfa (260 znaków)
Nie golfowany:
(Używa defun, aby umożliwić testowanie i dłuższe nazwy zmiennych dla czytelności)
Przykładowe użycie:
Wyjaśnienie
Zwraca true, jeśli punkt (i, j) mieści się w danym okręgu okręgu. Odległość euklidesowa jest obliczana przez przyjęcie wartości bezwzględnej liczby zespolonej, która reprezentuje wektor od (i, j) do środka obwodu.
Zamapuj tę funkcję na liście okręgów i sprawdź, czy dany punkt (i, j) mieści się w parzystej liczbie okręgów.
Wybierz kolor na podstawie tego testu.
Zbierz razem płaską listę wszystkich bajtów rgb, zapętlając każdy z nich (i, j) na obrazie i łącząc razem powstałe listy.
Konwertuj tę listę bajtów na odpowiednią tablicę bajtów, aby zpng mógł poprawnie ją przetworzyć.
Utwórz obiekt png.
Utwórz funkcję, aby pobrać szerokość, wysokość, dwa kolory i listę okręgów, i zwróć utworzony obiekt png.
źródło
JavaScript (ES6), 224 bajty
Widziałem rozwiązanie JS + SVG, ale po prostu musiałem stworzyć rozwiązanie oparte na kanwie ;-) Jest to funkcja zwracająca element canvas. Jeśli można podać istniejący element canvas, usuń 40 bajtów.
Zadzwoń jak
f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])
Przykładowe dane wyjściowe:
źródło
Löve2D , 353 bajtów.
źródło