Kiedy wbijesz zestaw gwoździ w drewnianą deskę i owiniesz je gumką, otrzymasz wypukły kadłub .
Twoim zadaniem, jeśli zdecydujesz się to zaakceptować, jest znalezienie Wypukłego Kadłuba danego zestawu punktów 2D.
Niektóre zasady:
- Napisz jako funkcję, argumentem są współrzędne listy punktów (w dowolnym formacie)
- Wyjściem musi być lista punktów w wypukłym kadłubie wymienionych zgodnie z ruchem wskazówek zegara lub przeciwnie do ruchu wskazówek zegara, zaczynając od dowolnego z nich
- Lista wyjściowa może mieć dowolny rozsądny format, w którym współrzędne każdego punktu są wyraźnie rozróżnialne. (Na przykład NIE lista z jednym przyciemnieniem {0,1, 1,3, 4, ...})
- Jeśli trzy lub więcej punktów w segmencie wypukłego kadłuba są wyrównane, na wyjściu należy zachować tylko dwie skrajności
Przykładowe dane:
Próbka 0
Wejście:
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
Wynik:
{{3, 3}, {1, 3}, {1, 1}}
(Liczby są tylko ilustracyjne)
Próbka 1
Wejście:
{{4.4, 14}, {6.7, 15.25}, {6.9, 12.8}, {2.1, 11.1}, {9.5, 14.9},
{13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, {5.3, 2.4},
{8.45, 4.7}, {11.5, 9.6}, {13.8, 7.3}, {12.9, 3.1}, {11, 1.1}}
Wynik:
{{13.8, 7.3}, {13.2, 11.9}, {9.5, 14.9}, {6.7, 15.25}, {4.4, 14},
{2.1, 11.1}, {0.6, 5.1}, {5.3, 2.4}, {11, 1.1}, {12.9, 3.1}}
Próbka 2
Wejście:
{{1, 0}, {1, 1}, {1, -1}, {0.68957, 0.283647}, {0.909487, 0.644276},
{0.0361877, 0.803816}, {0.583004, 0.91555}, {-0.748169, 0.210483},
{-0.553528, -0.967036}, {0.316709, -0.153861}, {-0.79267, 0.585945},
{-0.700164, -0.750994}, {0.452273, -0.604434}, {-0.79134, -0.249902},
{-0.594918, -0.397574}, {-0.547371, -0.434041}, {0.958132, -0.499614},
{0.039941, 0.0990732}, {-0.891471, -0.464943}, {0.513187, -0.457062},
{-0.930053, 0.60341}, {0.656995, 0.854205}}
Wynik:
{{1, -1}, {1, 1}, {0.583004, 0.91555}, {0.0361877, 0.803816},
{-0.930053, 0.60341}, {-0.891471, -0.464943}, {-0.700164, -0.750994},
{-0.553528, -0.967036}}
Obowiązują standardowe zasady gry w golfa. Brak bibliotek geometrii ad-hoc. Wygrywa krótszy kod.
Edytuj 1
Szukamy tutaj odpowiedzi algorytmicznej, a nie wstępnie zaprogramowanej procedury wyszukiwania wypukłego kadłuba, takiej jak ta w MatLab lub ta w Mathematica
Edytuj 2
Odpowiadanie na komentarze i dodatkowe informacje:
- Możesz założyć, że lista wprowadzania zawiera minimalną liczbę punktów, która Ci odpowiada. Ale musisz zapewnić właściwe traktowanie wyrównanych (pod) zestawów.
- Powtarzające się punkty możesz znaleźć na liście wprowadzania
- Maksymalna liczba punktów powinna być ograniczona tylko dostępną pamięcią
- Re „zmiennoprzecinkowy”: Musisz mieć możliwość przetwarzania list wejściowych ze współrzędnymi dziesiętnymi, jak podano w próbkach. Możesz to zrobić za pomocą reprezentacji zmiennoprzecinkowej
.
Odpowiedzi:
Ruby, 168 znaków
Ten kod ruby wykorzystuje również algorytm pakowania prezentów. Funkcja
C
przyjmuje tablicę punktów i zwraca wypukły kadłub jako tablicę.Przykład:
źródło
Mathematica 151
wciąż trwajątestowanie:
źródło
CoffeeScript, 276:
Jeśli funkcja nie musi być dostępna, usuń,
f=
aby zgolić jeszcze dwa znaki.Wejście / wyjście to pojedyncza tablica punktów, przy czym każdy punkt jest definiowany przez
x,y
właściwości. Tablica wejściowa jest modyfikowana, a także zwracana (jeśli ta ostatnia nie jest wymagana, usuń dwa ostatnie znaki).Wyjaśnienie może zostać dodane później.
Zestaw testowy (nie będzie działał w oldIE):
sugerowane środowisko testowe: http://coffeescript.org/
źródło
{{1, 1}, {2, 2}, {3, 3}, {1, 3}}
i powróciło,[{"x" : 1, "y" : 1, "r" : 0}, {"x" : 1, "y" : 3, "r" : 0}, "x" : 2, "y" : 2, "r" : 0.78..}]
podczas gdy myślę, że poprawną odpowiedzią jest permutacja{{3, 3}, {1, 3}, {1, 1}}
Python,
209 205195Wykorzystuje algorytm pakowania prezentów. Wynik zaczyna się od punktu najbardziej na lewo i jest zawijany przeciwnie do ruchu wskazówek zegara.
Przykład:
h([(1, 1), (2, 2), (3, 3), (1, 3)])
zwraca[(1, 3), (1, 1), (3, 3)]
źródło
print
aby uzyskać wynik?the output list can be in any reasonable format
było wystarczająco jasne. Czy uważasz, że należy to wyraźnie stwierdzić?h([(0, 1), (0,1), (0.1 , 1)])
daje mi[(0, 1), (0.10000000000000001, 1)]