Wyzwanie polega na znalezieniu najmniejszego dysku zawierającego określone punkty. Jest to jednak nieco trudniejsze, ponieważ w tym wyzwaniu współrzędne i promień dysku muszą być liczbami całkowitymi.
Wprowadzony zostanie wykaz punktów o współrzędnych całkowitych x
i y
. Możesz to potraktować jako listę krotek, listę list lub w jakikolwiek inny sposób reprezentujący zbiór par. x
i y
obie będą (prawdopodobnie ujemnymi) liczbami całkowitymi. Każdy punkt na pewno będzie unikalny i będzie co najmniej jeden punkt.
Jego wynik będzie na dysku w postaci trzech cyfr X
, Y
, i R
. X
, Y
i R
wszystkie są liczbami całkowitymi X
i Y
reprezentują środek dysku oraz R
jego promień. Odległość między każdym danym punktem a środkiem musi być mniejsza lub równa R
i nie może istnieć taki dysk z mniejszym, R
który również spełnia ten warunek.
Możliwe, że dla danych wejściowych będzie wiele możliwych rozwiązań, w tym przypadku kod musi wypisać co najmniej jedno z nich.
Możesz użyć dowolnego rodzaju wbudowanych geometrii obsługiwanych przez Twój język, jeśli takie istnieją, a dane wejściowe / wyjściowe mogą odbywać się za pośrednictwem wbudowanych obiektów punktowych / dyskowych zamiast samych liczb.
Przypadki testowe
Input (Possible) Output(s)
(x,y) (X,Y,R)
-------------------------
(0,0) (0,0,0)
-------------------------
(0,1) (0,0,1)
(1,0) (1,1,1)
-------------------------
(1,4) (4,4,3)
(3,2)
(4,1)
(4,5)
(5,2)
(7,4)
-------------------------
(-1,0) (0,0,2)
(2,0) (1,0,2)
-------------------------
(-1,0) (1,0,2)
(2,1) (0,1,2)
-------------------------
(0,0) (1,0,1)
(1,1) (0,1,1)
Wygrywa najmniej bajtów.
Odpowiedzi:
Galaretka ,
252422212018 bajtówDzięki @EriktheOutgolfer za poinformowanie mnie o
)
zapisaniu 1 bajtu.Dzięki @Dennis za zapisanie 2 bajtów.
Wypróbuj online!
Wyjaśnienie
źródło
€
?Brachylog v2, 19 bajtów
Wypróbuj online!
Ten program był łatwy do napisania - Brachylog jest prawie idealny do tego rodzaju problemów - ale trudny do gry w golfa. Nie zdziwiłoby mnie to, gdyby gdzieś tutaj zapisano bajt, ponieważ niewiele rzeczy wydawało się mieć jakikolwiek efekt (i zawiera instrukcje zagnieżdżonej mapy, zwykle znak, że powinieneś używać członka / findall, ale nie mogę znaleźć sposób, aby to zrobić).
To jest przesłanie funkcji. Dane wejściowe są od lewego argumentu do funkcji w formacie
[[x,y],[x,y],…]
, dane wyjściowe od prawego argumentu w formie[r,[[x,y]]]
. (Jeśli chcesz wypróbować liczby ujemne na wejściu, zwróć uwagę, że Brachylog używa_
znaku minus, a nie-
. Jest to mylące, ponieważ funkcja → pełne opakowanie programu, z którym Brachylog jest dostarczany, żądana za pomocą argumentu wiersza poleceńZ
, wyświetli liczby ujemne na wyjściu ze zwykłym znakiem minus).Wyjaśnienie
Jest to interesujące, ponieważ prosimy Brachylog o znalezienie wartości niektórych właściwości (w tym przypadku promień dysku wyśrodkowany w punkcie,
A
który pasuje do wszystkich punktów wejściowych), ale z trudem nakładamy na niego jakiekolwiek wymagania (wszystko czego potrzebujemy to że promień jest liczbą). Jednak Brachylog wewnętrznie obliczy dany promień symbolicznie, zamiast próbować użyć konkretnych liczb, więc po osiągnięciu finału≜
osiąga dwie rzeczy naraz: po pierwsze, zapewnia, że tylko liczby całkowite są używane dla współrzędnychA
i dla promienia (zmuszając kwadratowy promień do liczby kwadratowej i wyjaśniając zastosowanie≤ᵛ
do znalezienia „maksimum lub więcej”); po drugie, znajduje najmniejszy możliwy możliwy promień (ponieważ promień jest pierwszy na wyjściu).Jedną rzeczą, która w ogóle nie jest określona w programie, jest to, że wszystkie punkty są mierzone względem tego samego środka dysku; jak napisano, nie ma żadnych ograniczeń, że nie używamy innego centrum dla każdego punktu. Jednak kolejność rozstrzygania powiązań (która w tym przypadku jest ustawiana przez trzecią
ᵐ
i która jako ograniczenie struktury zostanie ocenione przed założeniem ograniczenia wartości≜
) chceA
być jak najkrótsza (tj. Pojedynczy element, więc używamy tego samego wyśrodkuj za każdym razem;A
najpierw próbuje zerowej długości, ale to oczywiście nie działa, więc próbuje następnej listy singletonów). W rezultacie uzyskujemy użyteczne ograniczenie (że mamy tylko jeden dysk) „za darmo”.To rozwiązanie uogólnia się na dowolną liczbę wymiarów , bez zmian w kodzie źródłowym; nie ma tu żadnych założeń, że rzeczy są dwuwymiarowe. Jeśli więc potrzebujesz najmniejszej sfery całkowitej, możesz to również mieć.
źródło
Perl 6 , 81 bajtów
Wypróbuj online!
Pobiera listę punktów jako listy 2-elementowe
((X1, Y1), (X2, Y2), ...)
. Zwraca listę(R, (X, Y))
. Używa tego samego podejścia, co odpowiedź Galaretki Pietu1998:minmax
Metoda jest przydatna tutaj jak to zwracaRange
. Iloczyn kartezjański zakresów daje bezpośrednio wszystkie punkty o współrzędnych całkowitych.źródło
05AB1E , 26 bajtów
Port odpowiedzi galaretki @ Pietu1998 .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Matlab, 73 bajty
Po prostu znajdź najmniejsze rozwiązanie (zmiennoprzecinkowe) i zaokrąglij do najbliższego punktu i ustaw promień (najgorszy przypadek dla problemu minimaksy). Nie wiem na pewno, czy to daje poprawne rozwiązanie dla wszystkich możliwych przypadków (w ramach precyzji), ale dla przypadków testowych powinno działać (jeśli nie popełniłem błędu pisowni).
Zadzwoń za pomocą
źródło
fminimax
Pyth ,
3433 bajtyDane wyjściowe są w formie
[R,x,y]
Spróbuj go online tutaj , lub sprawdzić wszystkie przypadki testowe od razu tutaj .
Edycja: Zapisano bajt, zmieniając format wyjściowy, poprzednia wersja:
heDm+d.EeSm@s^R2-Vdk2Q*Fm}FhM_BSdC
źródło
Wolfram Language (Mathematica) , 66 bajtów
Oto podejście brutalnej siły. Rozważyłem znacznie krótszą
BoundingRegion[#,"MinDisk"]&
funkcję, ale nie ma sposobu na wymuszenie współrzędnych całkowitych i promienia.Wypróbuj online!
źródło
{Round@#[[1]], Ceiling@#[[2]]} &@BoundingRegion[#, "MinDisk"]&
?Java 10,
283279277257 bajtów-20 bajty dzięki @nwellnhof jest wierzchołek użyciem
Math.hypot
.Tablica wyników jest w kolejności
[R,X,Y]
.Wypróbuj online.
Wyjaśnienie:
źródło
Math.hypot
.Math.hypot
, co jest idealne do tego wyzwania! -20 bajtów tutaj. Dzięki. :)JavaScript, 245 bajtów
(Nieco) bardziej czytelna wersja:
Po prostu znajduje obwiednię i sprawdza każdą współrzędną w tym polu, czy jest najlepsza.
Mógłbym zapisać 8 bajtów z przybliżoną odpowiedzią, zastępując:
Math.ceil(Math.sqrt(n[2]))
z~~(n[2]+1-1e-9)
źródło
for(f=c;f<b;f++){for(g=e;g<d;g++){s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);n=n?n[2]>s?[f,g,s]:n:[f,g,s]}}
w golfafor(f=c;f<b;f++)for(g=e;g<d;n=n?n[2]>s?[f,g,s]:n:[f,g,s],g++)s=a.reduce((o,[p,q])=>o>(r=(p-f)**2+(q-g)**2)?o:r);
. I jestem prawie pewien, że możesz usunąć miejsce nareturn[
.Math.hypot
.Rubin , 113 bajtów
Wypróbuj online!
źródło
Węgiel drzewny , 65 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wprowadź współrzędne Y do
z
.Wprowadź współrzędne X do
h
.Pętla obejmuje zakresy od minimum do maksimum
h
iz
generuje listę wszystkich potencjalnych centrów dyskowych.Zapętl wszystkie centra dyskowe, następnie zapętl wszystkie oryginalne punkty, a następnie zapisz obie współrzędne, odejmij, kwadrat, suma, weź maksimum i zapisz wynikową listę.
Znajdź pozycję minimalnej maksymalnej średnicy i wydrukuj odpowiedni środek tarczy.
Wydrukuj minimalną maksymalną średnicę, ale zaokrągl ją w górę do następnej liczby całkowitej.
źródło