Mały Chandler jest smutny. Narysuj mu chmurę, aby go pocieszyć.
Uwaga: narysowanie chmury tak naprawdę go nie poprawi.
Okrąg można zdefiniować jako 3- krotny, (x,y,r)
gdzie x
pozycja x koła na płaszczyźnie kartezjańskiej, y
pozycja y koła na płaszczyźnie kartezjańskiej i r
jest promieniem okręgu. x
i y
może być negatywny. r
jest zawsze pozytywne. Dane wejściowe to lista okręgów w postaci 3-krotek oddzielonych spacjami. Na przykład:
3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8
Te 3,1,1
środki „okręgu z punktem środkowym w 3,1
z 1 promień. 3,2,1.5
Oznacza” okręgu z punktem środkowym w 3,2
1,5 promienia.
Jeśli narysujemy wszystkie te okręgi danych wejściowych na wykresie, wygląda to tak (zamieściłem linie siatki i etykiety tylko dla przejrzystości; nie są one wymagane):
Zauważ, że wszystkie kręgi są spójne . Oznacza to, że wszystkie one zachodzą na siebie tak, że tworzy jedną dużą grupę bez małych grup kół oddzielonych od reszty. Wejście jest gwarantowana być spójna.
Załóżmy, że teraz narysujemy linię, która biegnie wokół „granicy” utworzonej przez te koła, bez żadnych innych linii. To byłoby jak narysowanie granicy sylwetki utworzonej przez wszystkie koła. Powstała chmura wyglądałaby mniej więcej tak:
Ta chmura została utworzona przez narysowanie tylko łuków okręgów na wejściu, które tworzą granicę, w wyniku czego powstaje pojedynczy kształt. Innymi słowy, chmura jest tworzona tylko przez rysowanie łuków, które nie znajdują się w innym okręgu. Twój program pobierze dane wejściowe w powyższej formie i wyświetli obraz, który wyświetli wynikową chmurę. Ogólny kształt chmury musi być prawidłowy, ale to od Ciebie zależy skala, kolor, grubość linii i sposób, w jaki wygląda na wierzchołki. Zauważ, że chmura musi być widoczna, więc nie możesz wyciągnąć czegoś takiego: „Ten program rysuje chmurę na białym tle”, „Ten program rysuje chmurę w nieskończenie małej skali”, „Ten program rysuje chmurę z 0 grubość linii ”itp. Należy również pamiętać, że kolor obramowania musi różnić się od koloru wypełnienia lub tła.
Inny przykład. Wejście:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7
Wynik:
Jeśli w chmurze jest „dziura”, również należy narysować dziurę. Wejście:
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
Wynik:
Oto ważna zasada: twój program musi rysować tylko linie tworzące granicę. Oznacza to, że NIE MOŻESZ po prostu narysować okręgów w pełni, a następnie narysować koła nieco mniejsze za pomocą białego wypełnienia - ponieważ ta metoda nadal rysuje linie, które nie tworzą granicy, po prostu je zakrywa. Celem tej reguły było zapobieżenie „narysowaniu okręgów, a następnie narysowaniu kół ponownie za pomocą białego wypełnienia” lub czegoś podobnego. Oczekuje się, że odpowiedź faktycznie obliczy, gdzie narysować rzeczy przed narysowaniem.
To jest golf golfowy, więc wygrywa najmniejsza liczba znaków.
źródło
Odpowiedzi:
Mathematica
177 126 121119Rozwiązywanie według regionów dyskowych: podejście matematyka
Logika polega na tym
Właśnie takie podejście zastosowano poniżej. Wyprodukowano 3 liczby powyżej.
Region niejawny nr 1 to połączenie kręgów. Region niejawny nr 2 to połączenie dysków leżących w kręgach. Różnica polega na granicy.
Rozwiązywanie według regionów dyskowych: podejście inżyniera (119 znaków)
Poniżej przedstawiono połączenie regionów dyskowych, dyskretyzację tego regionu i znalezienie jego granicy. Punkty na schemacie wyznaczają interwały siatki Delaunaya. Pokazujemy poniżej dyskretny region, aby podświetlić obiekt, który stanowi granicę zainteresowania (kontur chmury).
„3,1,1 3,2,1,5 1,2,0,7 0,9,1,2,2,2 1,0,0,8”
Granica regionu jest dyskrecjonalna.
Rozwiązywanie problemów przez wykrywanie krawędzi: Podejście fotografa - 121 znaków
Rysuje dyski na czarno, rasteryzuje obraz, wykrywa krawędzie i odwraca czarno-biały.
źródło
RegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
s=StringSplit
wewnątrz zachęty? Spróbuj przesunąć to na przód, nadal powinno być krótsze niż bieżąca wersja.T-SQL
23523422921217173 bajtyWykorzystuje to funkcje przestrzenne w SQL Server 2012+. Po uruchomieniu w SSMS (SQL Server Management Studio) tworzy okienko wyników przestrzennych.
Dane wejściowe pochodzą ze zmiennej @i. Mógłbym to jeszcze bardziej zmniejszyć, gdyby dane wejściowe można było pobrać z tabeli.Ponieważ wprowadzanie tabeli jest teraz dozwolone.
Poprzednie rozwiązanie pozostawiłem poniżej.
Edycja : Usuń zbłąkane miejsce, nadwyżkę do i podzapytanie
171: Zastąpiono tworzenie tabeli CTE i @s @.
Podział dynamicznego SQL
źródło
'A' has fewer columns than were specified in the column list
DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7'
. Niestety nie mogę w tej chwili przetestować, a SQLfiddle nie gra ładnie w 2012 roku.Mathematica,
175158149 bajtówPamiętam z dyskusji w piaskownicy, że to podejście miało być poprawne, ale nie jestem całkowicie pewien, jak to się dzieje z nowym brzmieniem reguł, więc @Lilac, daj mi znać, jeśli uważasz, że to narusza reguły.
Zasadniczo tworzę warunek logiczny, który jest prawdziwy dla wszystkich punktów w chmurze i fałszywy dla wszystkich punktów poza nim. Karmię to tym,
RegionPlot
co następnie renderuje region wszystkich punktów, w których znajduje się wyrażenie,True
oraz kontur wokół niego.Nie golfowany:
źródło
ImplicitRegion
automatycznie znajduje odpowiednie wartości x i y do kreślenia. 122 znaki:s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
RegionPlot
tej pory.),AspectRatio-> 1
kod wraca do 149 bajtów, dokładnie tam, gdzie teraz stoi.Python 3.3 (
183177164160 bajtów)Wymaga konsoli o szerokości 80 znaków, która, jak wiem, jest domyślna w systemie Windows. Działa najlepiej, jeśli twoja konsola ma kwadratową czcionkę. Oto niektóre fragmenty niektórych danych wejściowych testu.
Oryginał:
Inne:
Otwór:
źródło
Python -
253249215199To jest reklama niesamowitej, zgrabnej biblioteki, której operacje geometryczne sprawiły, że pisanie rozwiązania było proste, poprzez narysowanie konturu połączenia nakładających się kół (= zbuforowanych punktów):
Wynik:
Edycja:
sys.argv[1:]
przezraw_input().split()
, zapisywanie aimport sys
k={'color':'k'}
luksus, zastąpionosavefig
przezshow
map(float,s.split(','))
przezeval(s)
źródło
Python - 535
źródło
from math import*
usunięcie niepotrzebnych spacji, używanie tylko literowych nazw zmiennych, używanie list (npcc=[z for z in a if z!=a2 and (z[0]…)]
.). Zobacz także wskazówki dotyczące gry w golfa w Pythonie .a2
.Python -
296249231223212Podziękowania dla @ richard-green (pozwolenie zostało wydane) za oryginalne rozwiązanie, po prostu trochę go zmniejszyłem.
źródło
pylab
zamiastmatplotlib.pyplot
.from pylab import *
będę jeszcze mógł zadzwonićshow()
iscatter()
bez jakichkolwiek odniesień?[eval(i)for i in raw_input().split()]
gdy pythoneval
zamienia1,2,3
się w krotkę. Będzie również oczywiście trzeba zmienić[x,y,r]
aby(x,y,r)
.JavaScript (E6) + HTML 322
JSFiddle
Każde koło jest podzielone na około 100 małych łuków, a każdy łuk jest rysowany, jeśli jego środkowy punkt nie znajduje się w żadnym z pozostałych okręgów.
źródło
Python 274 bajtów
To pobiera dane wejściowe ze standardowego wejścia i sprawdza każdy punkt na wyświetlaczu, rysując piksele jeden po drugim. Nie do końca wydajny, ale spełnia wszystkie zasady.
Zauważ, że wyświetlanie gry pygame zakończy się po zakończeniu rysowania, nie byłem pewien, czy powinienem dołączyć ją jako część mojej odpowiedzi, ale aby ją wyświetlić, możesz albo wrzucić ją
raw_input
na końcu, albo dodać małą pętlę, jeśli chcesz powstrzymać system operacyjny przed narzekaniem, że nie odpowiada i takie:Przykładowe obrazy:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7, 1,2,0.7
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
źródło
Perl - 430
Zapisuje plik PBM na standardowe wyjście.
Obraz testowy (przekonwertowany na png):
źródło