Biorąc pod uwagę listę współrzędnych całkowitych, znajdź obszar największego wypukłego wielokąta, jaki możesz zbudować z listy, tak aby -
- każdy wierzchołek jest na liście
- żaden element listy nie jest zawarty w wielokącie.
Przykład:
(0, 0) (8, 0) (0, 1) (3, 1) (7, 1) (1, 2) (5, 2) (9, 2) (2, 3) (5, 3) (7, 3) (3, 4) (5, 5) (11, 5)
Wizualizowane:
o o
o o o
o o o
o o o
o
o o
Największy wypukły wielokąt, jaki możesz z tego zrobić, to:
o
o o
o o
o o
o
o
O powierzchni 12.
Możesz wziąć listę współrzędnych w dowolnym rozsądnym formacie i powinieneś wypisać (w odpowiedni sposób dla swojego wybranego języka) obszar największego wypukłego wielokąta, zaokrąglony do co najmniej 2 cyfr po przecinku.
Dodatkowo musisz zastosować jakiś algorytm, a nie po prostu brutalną siłę wszystkich podzbiorów punktów. Aby to wymusić, Twój program musi rozwiązać listę 50 wierzchołków w niecałą minutę na nowoczesnym komputerze.
Najkrótszy kod w bajtach wygrywa.
Odpowiedzi:
JavaScript ES6, 738 bajtów
Oto wersja ES5 lub starsza, która powinna działać w większości przeglądarek i węzłów bez podkręcania: 827 bajtów
Kod zwraca anonimową funkcję. Jako parametr wymaga tablicy punktów, takich jak
[[0,1],[2,3],[4,5]]
. Aby go użyć, możesz umieścićvar f=
go przed nim, lub jeśli chcesz go użyć z wiersza poleceń, dodaj(process.argv[2].replace(/ /g,'').slice(1,-1).split(')(').map((x)=>x.split(',')))
na końcu i wywołaj jaknode convpol.js '(1,2)(3,4)(5,6)'
Dzięki za wyzwanie! Ponieważ nie ma implementacji referencyjnej, nie mogę udowodnić, że jest to poprawne, ale jest spójne przynajmniej w przypadku permutacji listy punktów. Prawie nie myślałem, że to zadziała, ponieważ wersje z kodem debugowania, nawet wyłączone, były zbyt wolne z wykładniczym wzrostem czasu. Mimo to zdecydowałem się na grę w golfa i cieszyłem się, że spadłem do mniej niż 2 sekund na 50 punktów na moim komputerze. Może obliczyć około 130 punktów w ciągu 1 minuty.
Algorytm jest podobny do skanu Grahama , z tym wyjątkiem, że musi szukać wszędzie pustych wypukłych kadłubów.
Wyjaśnienie
Oto ogólny przegląd działania algorytmu. Istotą tego algorytmu jest po prostu wyszukiwanie wypukłych pętli przeciwnie do ruchu wskazówek zegara, które nie zawierają punktu. Procedura jest mniej więcej taka:
Ponadto, jako optymalizacja, zapisujemy początkową parę łańcucha jako sprawdzoną, więc wszelkie wyszukiwania po zobaczeniu tej pary w dowolnym miejscu w łańcuchu mogą natychmiast przerwać wyszukiwanie, ponieważ największy wielokąt z tą parą został już znaleziony.
Ten algorytm nigdy nie powinien znaleźć wielokąta dwa razy i eksperymentalnie to zweryfikowałem.
źródło
===
i!==
z==
a!=
, ale nie mogę być pewny, nie rozumiejąc swój kod ...(x,i)=>p.i==i
(13 znaków) jest nieco dłuższy niżx=>p===x
(8 znaków) nawet po optymalizacji.