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
Die Funktion mit dem Namen ithat hat eine Reihe von Punkten übergeben und gibt 0 oder 1 zurück. Semikolons und Zeilenumbrüche sind zum Beenden eines Befehls austauschbar. Ich habe nur ein paar Dinge zusammengefasst, um den Code sichtbar kurz zu halten, da wir nicht an Lesbarkeit gewöhnt sind Code hier sowieso herum.
Eukleides ist eine ebene Geometriesprache, die hauptsächlich für die grafische Ausgabe gedacht ist, aber auch über gute programmatische Fähigkeiten verfügt. Ich dachte, es wäre großartig für diese Aufgabe, aber ein paar Dinge frustrierten mich. Zunächst ist anzumerken, dass Mengen in Eukleides im Wesentlichen Arrays von Punkten sind und gegebenenfalls als Pfade aus verbundenen Liniensegmenten wiedergegeben werden. Eukleides unterstützt die iterative Erzeugung von Mengen über loci, ähnlich einer for-Schleife, die dabei eine Menge erzeugt. Wäre es mir möglich gewesen, einen Locus zu verwenden, hätte er die Anzahl der Bytes verringert, aber anscheinend möchte Eukleides nicht von sich aus auf einen teilweise geformten Locus verweisen.
Die andere große Enttäuschung war, dass, wenn anscheinend zwei identische Liniensegmente übereinander liegen, intersectionnur ein beleidigender Punkt zurückgegeben wird (was, ich nehme an, Sinn macht, dass es unendlich viele Schnittpunkte geben würde). Meine Methode besteht im Wesentlichen darin, den Pfad einen Schritt hinter sich aufzubauen und das nächste Liniensegment auf Schnittpunkte mit dem Pfad zu testen. Aufgrund des oben genannten Kreuzungsverhaltens überprüfe ich separat, ob sich der Punkt auf dem Weg befindet oder nicht .
Bearbeiten : Schneiden Sie 1 Byte ab, indem Sie die orAnweisung neu anordnen , damit zuvor ein Leerzeichen entfernt werden kann or. 5 weitere Bytes durch Ändern dieses ifBlocks in eine ternäre Operation.
Testfälle:
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