Учитывая упорядоченный список из 2 или более двумерных декартовых точек, выведите истинное значение, если путь касается самого себя или самопересекается; в противном случае выведите ложное значение, если оно не касается самого себя или не пересекается.
Вы можете предположить, что последовательные пункты в списке различны.
Примеры:
(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey
Обратите внимание, что все координаты, которые я дал здесь, являются целыми числами. Вы можете поддерживать координированные входные данные, которые вам нравятся, из {целых, десятичных, рациональных, с плавающей точкой, ...}. Но ваши расчеты реализаций должны давать правильные ответы на любые входные данные.
Ответы:
Python 2 ,
315309298382380372 байтаПопробуйте онлайн!
Использует алгоритм из здесь , в сочетании с этим SO ответ на коллинеарных сегментов.
Редактировать: Исправлено для отрезков, продолжающихся в том же направлении (например
(0,0),(1,0),(2,0)
) путем удаления средней точки (в результате(0,0),(2,0)
).источник
*((n*N>0)+(m*M>0)<1)
->*(n*N<=0>=m*M)
.Евклейд ,
154148 байтФункция с таким именем
i
, передала набор точек, возвращает 0 или 1. Точки с запятой и разрывы строк взаимозаменяемы для завершения команды, я просто смешал несколько вещей вместе, чтобы сделать код визуально коротким, так как мы не привыкли к разборчивости в любом случае код здесь.Eukleides - это язык плоской геометрии, предназначенный главным образом для графического вывода, но также с приличными возможностями программирования. Я думал, что это было бы здорово для этой задачи, но некоторые вещи расстроили меня. Во-первых, стоит отметить, что множества в Евклиде являются по существу массивами точек и, когда это применимо, отображаются в виде путей, состоящих из соединенных отрезков. Eukleides поддерживает итеративную генерацию наборов с помощью локусов, похожих на цикл for, который создает набор в процессе. Если бы я мог использовать локус, он бы сбрил байты, но, видимо, Евклейд не любит ссылаться на частично сформированный локус изнутри себя.
Другое серьезное разочарование заключалось в том, что если, по-видимому, два одинаковых отрезка находятся друг над другом,
intersection
возвращает только одну оскорбительную точку (что, я думаю, имеет смысл, если бы пересечения были бесконечными). Мой метод заключается в том, чтобы построить путь на один шаг позади и проверить следующий отрезок линии на наличие пересечений с путем. Из-за вышеупомянутого поведения пересечения я проверяю отдельно, находится ли точка на пути.Редактировать : обрезать 1 байт, переупорядочив
or
оператор, чтобы учесть удаление пробела раньшеor
; Еще 5 байтов, превратив этотif
блок в троичную операцию.Тестовые случаи:
источник