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
Nama fungsi i itu, melewati serangkaian titik, mengembalikan 0 atau 1. Tanda titik koma dan jeda baris dapat dipertukarkan untuk mengakhiri perintah, saya hanya menyatukan beberapa hal bersama-sama demi menjaga kode terlihat singkat karena kita tidak terbiasa terbaca kode di sekitar sini pula.
Eukleides adalah bahasa bidang geometri terutama untuk output grafis, tetapi dengan kemampuan pemrograman yang baik juga. Saya pikir itu akan bagus untuk tugas ini, tetapi beberapa hal membuat saya frustrasi. Pertama, perlu dicatat bahwa set pada Eukleides pada dasarnya adalah array poin, dan ketika berlaku diberikan sebagai jalur yang dibuat dari segmen garis yang terhubung. Eukleides mendukung pembuatan iteratif set melalui loci, mirip dengan for-loop yang menciptakan set dalam proses. Seandainya saya bisa menggunakan lokus, itu akan mencukur byte, tetapi tampaknya Eukleides tidak suka merujuk lokus yang terbentuk sebagian dari dalam dirinya sendiri.
Frustrasi besar lainnya adalah bahwa jika, tampaknya, dua segmen garis yang identik berada di atas satu sama lain, intersectionhanya mengembalikan satu titik yang menyinggung (yang masuk akal, saya kira, akan ada persimpangan yang tak terbatas). Metode saya pada dasarnya adalah untuk membangun jalur satu langkah di belakang, dan menguji segmen baris berikutnya untuk persimpangan dengan jalur. Karena perilaku persimpangan tersebut saya periksa secara terpisah apakah titik ada di jalan.
Sunting : Potong 1 byte dengan menyusun kembali orpernyataan untuk memungkinkan penghapusan spasi sebelumnya or; 5 byte lebih banyak dengan mengubah ifblok itu menjadi operasi ternary.
Kasus uji:
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