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
Funkcja o nazwie, i
że przekazała zestaw punktów, zwraca 0 lub 1. Średniki i podziały linii są wymienne do zakończenia polecenia, po prostu zrzuciłem kilka rzeczy ze względu na utrzymanie krótkiego kodu, ponieważ nie jesteśmy przyzwyczajeni do czytelności i tak kod tutaj.
Eukleides to język geometrii płaskiej przede wszystkim do grafiki, ale także z przyzwoitymi zdolnościami programistycznymi. Pomyślałem, że będzie świetnie do tego zadania, ale kilka rzeczy mnie frustrowało. Po pierwsze, warto zauważyć, że zestawy w Eukleidach są w zasadzie tablicami punktów, a gdy ma to zastosowanie, są renderowane jako ścieżki wykonane z połączonych segmentów linii. Eukleides obsługuje iteracyjne generowanie zestawów za pomocą loci, podobnie jak pętla for, która tworzy zestaw w procesie. Gdybym był w stanie użyć locus, wygoliłby bajty, ale najwyraźniej Eukleides nie lubi odwoływać się do częściowo uformowanego locus od siebie.
Inną poważną frustracją było to, że jeśli pozornie dwa identyczne segmenty linii znajdują się jeden nad drugim, intersection
zwraca tylko jeden punkt obrażenia (co, jak sądzę, ma sens, byłyby nieskończone przecięcia). Moja metoda polega zasadniczo na zbudowaniu ścieżki o krok do tyłu i przetestowaniu następnego segmentu linii pod kątem przecięć ze ścieżką. Z powodu wyżej wspomnianego zachowania na skrzyżowaniu osobno sprawdzam, czy punkt znajduje się na ścieżce.
Edycja : Odetnij 1 bajt, zmieniając kolejność or
instrukcji, aby umożliwić wcześniejsze usunięcie spacji or
; 5 dodatkowych bajtów, zmieniając ten if
blok w operację potrójną.
Przypadki testowe:
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