Dada una lista ordenada de 2 o más puntos cartesianos 2D, genera un valor verdadero si la ruta se toca a sí misma o se auto-intersecta; de lo contrario, generará un valor falso si no se toca a sí mismo o no se cruza automáticamente.
Puede suponer que los puntos consecutivos en la lista son distintos.
Ejemplos:
(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
Tenga en cuenta que todas las coordenadas que di aquí son enteros. Puede admitir entradas de coordenadas de lo que quiera de {entero, decimal, racional, coma flotante, ...}. Pero sus cálculos de implementación deben dar las respuestas correctas para cualquier entrada dada.
Respuestas:
Python 2 ,
315309298382380372 bytesPruébalo en línea!
Utiliza el algoritmo de aquí , combinado con esta respuesta SO para segmentos colineales.
Editar: Corregido para segmentos de línea que continúan en la misma dirección (p
(0,0),(1,0),(2,0)
. Ej. ) Al eliminar el punto medio, (lo que resulta en(0,0),(2,0)
).fuente
*((n*N>0)+(m*M>0)<1)
->*(n*N<=0>=m*M)
.Eukleides ,
154148 bytesLa función llamada
i
así, pasó un conjunto de puntos, devuelve 0 o 1. Los puntos y líneas y los saltos de línea son intercambiables para finalizar un comando, solo reuní algunas cosas para mantener el código visiblemente corto ya que no estamos acostumbrados a ser legible código por aquí de todos modos.Eukleides es un lenguaje de geometría plana principalmente para salida gráfica, pero con habilidades programáticas decentes también. Pensé que sería genial para esta tarea, pero algunas cosas me frustraron. Primero, vale la pena señalar que los conjuntos en Eukleides son esencialmente conjuntos de puntos y, cuando corresponde, se representan como rutas hechas de segmentos de línea conectados. Eukleides admite la generación iterativa de conjuntos a través de loci, similar a un ciclo for que crea un conjunto en el proceso. Si hubiera podido usar un locus, habría reducido los bytes, pero aparentemente a Eukleides no le gusta hacer referencia a un locus parcialmente formado desde dentro de sí mismo.
La otra gran frustración fue que si, aparentemente, dos segmentos de línea idénticos están uno encima del otro,
intersection
solo devuelve un punto ofensivo (lo que tiene sentido, supongo, habría infinitas intersecciones). Mi método es esencialmente construir la ruta un paso atrás y probar el siguiente segmento de línea para intersecciones con la ruta. Debido al comportamiento de intersección mencionado anteriormente, verifico por separado si el punto está en el camino o no .Editar : Corte 1 byte reordenando la
or
instrucción para permitir la eliminación de un espacio antesor
; 5 bytes más al cambiar eseif
bloque en una operación ternaria.Casos de prueba:
fuente