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
Fonction nommée i
qui, a passé un ensemble de points, renvoie 0 ou 1. Les points-virgules et les sauts de ligne sont interchangeables pour terminer une commande, je viens de regrouper quelques éléments pour garder le code visiblement court car nous ne sommes pas habitués à la lisibilité code ici de toute façon.
Eukleides est un langage de géométrie plane principalement pour la sortie graphique, mais aussi avec des capacités programmatiques décentes. Je pensais que ce serait génial pour cette tâche, mais quelques choses m'ont frustré. Tout d'abord, il convient de noter que les ensembles à Eukleides sont essentiellement des tableaux de points et, le cas échéant, sont rendus sous forme de chemins constitués de segments de ligne connectés. Eukleides prend en charge la génération itérative d'ensembles via des loci, semblable à une boucle for qui crée un ensemble dans le processus. Si j'avais pu utiliser un locus, cela aurait réduit les octets, mais apparemment Eukleides n'aime pas référencer un locus partiellement formé de l'intérieur.
L'autre grande frustration était que si, apparemment, deux segments de ligne identiques sont l'un sur l'autre, intersection
ne renvoie qu'un seul point incriminé (ce qui est logique, je suppose, il y aurait des intersections infinies). Ma méthode consiste essentiellement à construire le chemin un pas en arrière et à tester le prochain segment de ligne pour les intersections avec le chemin. En raison du comportement d'intersection susmentionné, je vérifie séparément si le point se trouve ou non sur le chemin.
Modifier : Coupez 1 octet en réorganisant l' or
instruction pour permettre la suppression d'un espace avant or
; 5 octets de plus en changeant ce if
bloc en opération ternaire.
Cas de 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