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
Fonksiyon adı iverilen, bir dizi nokta geçti, 0 veya 1 döndürür. Noktalı virgüller ve satır sonları bir komutu sonlandırmak için değiştirilebilir, sadece okunaklı olmadığımız için kodu görünür bir şekilde kısa tutmak için birkaç şeyi bir araya getirdim. Zaten buralarda kod.
Ökleidler, öncelikle grafiksel çıktı için, fakat aynı zamanda iyi programatik yeteneklere sahip bir düzlem geometri dilidir. Bu görev için harika olacağını düşündüm, ama birkaç şey beni hayal kırıklığına uğrattı. Birincisi, Eukleides'teki setlerin esasen nokta dizileri olduğunu ve uygulanabilir olduğunda bağlı çizgi segmentlerinden yapılmış yollar olarak oluşturulduğunu belirtmek gerekir. Eukleides, süreçte bir küme oluşturan bir for-döngüye benzer şekilde lokuslar aracılığıyla yinelemeli kümelerin oluşturulmasını destekler. Bir lokusu kullanabilseydim, baytları tıraş ederdi, ama görünüşe göre Eukleides, kısmen oluşturulmuş bir lokusa kendi içinden referans vermek istemiyor.
Diğer büyük hayal kırıklığı, görünüşte, iki özdeş çizgi parçasının üst üste gelmesi durumunda, intersectionsadece bir kırılma noktası döndürmesi (sanırım, sonsuz kavşaklar olacaktı). Benim yöntemim aslında bir adım gerideki yolu oluşturmak ve bir sonraki çizgi parçasını yolla kesişimler açısından test etmektir. Çünkü yukarıda bahsedilen kesişme davranış noktanın olup olmadığı için ayrı ayrı kontrol ile yol.
Düzenleme : orBir boşluk önce kaldırılmasına izin vermek için deyimi yeniden sıralayarak 1 bayt kesin or; Bu ifbloğu üçlü bir işleme dönüştürerek 5 bayt daha .
Test senaryoları:
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