Napisz program, aby ustalić, czy wejściowy wielokąt jest wypukły . Wielokąt jest określona jedną linię N , liczbę wierzchołków, a następnie N linie zawierające x oraz y współrzędnych każdego wierzchołka. Wierzchołki zostaną wyświetlone zgodnie z ruchem wskazówek zegara, zaczynając od dowolnego wierzchołka.
Przykład 1
wkład
4
0 0
0 1
1 1
1 0
wydajność
convex
przykład 2
wkład
4
0 0
2 1
1 0
2 -1
wydajność
concave
przykład 3
wkład
8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0
wydajność
convex
x i y są liczbami całkowitymi, n <1000 i | x |, | y | <1000 . Możesz założyć, że wejściowy wielokąt jest prosty (żadna z krawędzi się nie krzyżuje, tylko 2 krawędzie dotykają każdego wierzchołka). Najkrótszy program wygrywa.
code-golf
math
geometry
decision-problem
Keith Randall
źródło
źródło
Odpowiedzi:
J, 105
Przechodzi wszystkie trzy testy powyżej.
Edycja: (111-> 115) Obsługuj punkty współliniowe, eliminując kąty pi. Zdobyłem kilka postaci w innym miejscu.
Edycja: (115-> 105) Mniej głupi.
Objaśnienie dla osób z zaburzeniami J:
(1!:1)3
przeczytaj STDIN do EOF. (Myślę.)0&".;._2
to fajny idiom do analizowania tego rodzaju danych wejściowych.j./"1}.
odciąć pierwszy wiersz wejścia (N 0) i przekształcić pary w kompleksy.(,2&{.)
umieść dwa pierwsze punkty na końcu listy.3(f)\
stosuje się do okna przesuwnego o długości 3 (3 punkty za kąt)[:-/12 o.-@-/@}.,-/@}:
to czasownik, który przekształca każde 3 punkty w kąt między -pi a pi.-@-/@}.,-/@}:
produkuje (p1 - p2), (p3 - p2). (Przypomnij, że są to kompleksy).12 o.
daje kąt dla każdego kompleksu.[:-/(...)
daje różnicę dwóch kątów.(o.1)([:>-.~)(o.2)|
mod 2 pi, wyeliminuj kąty pi (odcinki proste) i porównaj z pi (większe niż, mniejsze niż, nie ma znaczenia, chyba że punkty mają być nawinięte w jednym kierunku).1=#=
jeśli wszystkie te porównania dają wynik 1 lub 0 (z samoklasyfikacją. Wydaje się to głupie.)echo>('concave';'convex'){~
druk wypukły.źródło
Python - 149 znaków
źródło
Ruby 1.9,
147133130124123źródło
scala: 297 znaków
źródło
def main(a:...
zamiastdef main(args:...
.