number i (set p)
g=card(p);h=g;n=0;e=p[0];q=e.e
for d in p
if h<g-1
q=q.e
n=card(intersection(d.e,q))>1or d on q?1|n
end
e=d;h=h-1
end;return n;end
La 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 antes or
; 5 bytes más al cambiar ese if
bloque en una operación ternaria.
Casos de prueba:
ta=point(0,0).point(1,0)
tb=point(0,0).point(1,0).point(0,0)
tc=point(0,0).point(1,0).point(1,1).point(0,0)
td=point(0,0).point(2,0).point(1,1).point(1,-1)
te=point(0,0).point(10,0).point(0,1).point(10,1).point(0,2).point(10,2)
print i(ta);print i(tb);print i(tc);print i(td);print i(te)
0
1
1
1
0