Напишите программу, чтобы определить, является ли входной многоугольник выпуклым . Многоугольник задается одной строкой, содержащей N , количество вершин, затем N строк, содержащих координаты x и y каждой вершины. Вершины будут перечислены по часовой стрелке, начиная с произвольной вершины.
пример 1
вход
4
0 0
0 1
1 1
1 0
выход
convex
пример 2
вход
4
0 0
2 1
1 0
2 -1
выход
concave
пример 3
вход
8
0 0
0 1
0 2
1 2
2 2
2 1
2 0
1 0
выход
convex
x и y являются целыми числами, N <1000 и | x |, | y | <1000 . Можно предположить, что входной многоугольник прост (ни одно из ребер не пересекается, только 2 ребра касаются каждой вершины). Кратчайшая программа выигрывает.
code-golf
math
geometry
decision-problem
Кит Рэндалл
источник
источник
Ответы:
J, 105
Проходит все три теста выше.
Редактировать: (111-> 115) Обрабатывать коллинеарные точки, устраняя углы пи. Получил несколько персонажей в другом месте.
Изменить: (115-> 105) Менее тупой.
Объяснение для J-инвалидов:
(1!:1)3
читать STDIN для EOF. (Я думаю.)0&".;._2
хорошая идиома для анализа такого рода ввода.j./"1}.
Отрезать первую строку ввода (N 0) и преобразовать пары в комплексы.(,2&{.)
прикрепите первые две точки в конец списка.3(f)\
применяет f к скользящему окну длиной 3 (3 точки на угол)[:-/12 o.-@-/@}.,-/@}:
это глагол, который превращает каждые 3 точки в угол между -pi и pi.-@-/@}.,-/@}:
производит (p1 - p2), (p3 - p2). (Напомним, что это комплексы.)12 o.
дает угол для каждого комплекса.[:-/(...)
дает разницу двух углов.(o.1)([:>-.~)(o.2)|
mod 2 pi, исключить углы pi (прямые отрезки) и сравнить с pi (больше, меньше, не имеет значения, если точки не должны быть намотаны в одном направлении).1=#=
если все эти результаты сравнения 1 или 0 (С самоклассификацией. Это кажется глупым.)echo>('concave';'convex'){~
печать выпуклая.источник
Питон - 149 символов
источник
Рубин 1.9,
147133130124123источник
Скала: 297 символов
источник
def main(a:...
вместоdef main(args:...
.