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 funzione ha chiamato iquesto, ha passato un set di punti, restituisce 0 o 1. I punti e virgola e le interruzioni di riga sono intercambiabili per la fine di un comando, ho appena raggruppato alcune cose insieme per mantenere il codice visibilmente breve poiché non siamo abituati a leggibili codice qui intorno comunque.
Eukleides è un linguaggio di geometria piana principalmente per l'output grafico, ma anche con capacità programmatiche decenti. Ho pensato che sarebbe stato fantastico per questo compito, ma alcune cose mi hanno frustrato. Innanzitutto, vale la pena notare che gli insiemi in Eukleides sono essenzialmente matrici di punti e, quando applicabile, sono resi come percorsi costituiti da segmenti di linea collegati. Eukleides supporta la generazione iterativa di set tramite loci, simile a un for-loop che crea un set nel processo. Se fossi stato in grado di usare un locus, si sarebbe rasato i byte, ma apparentemente a Eukleides non piace fare riferimento a un locus parzialmente formato dall'interno di se stesso.
L'altra grande frustrazione è che se, a quanto pare, due segmenti di linea identici fossero uno sopra l'altro, intersectionrestituisce solo un punto offensivo (il che ha senso, suppongo, ci sarebbero intersezioni infinite). Il mio metodo è essenzialmente quello di costruire il percorso un passo indietro e testare il segmento di linea successivo per intersezioni con il percorso. A causa del suddetto comportamento di intersezione, controllo separatamente se il punto si trova sul percorso.
Modifica : tagliare 1 byte riordinando l' oristruzione per consentire la rimozione di uno spazio prima or; 5 byte in più modificando quel ifblocco in un'operazione ternaria.
Casi test:
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