Geben Sie bei einer geordneten Liste von 2 oder mehr kartesischen 2D-Punkten einen Wahrheitswert aus, wenn sich der Pfad selbst berührt oder sich selbst schneidet. Andernfalls wird ein falscher Wert ausgegeben, wenn er sich nicht selbst berührt oder sich selbst schneidet.
Sie können davon ausgehen, dass aufeinanderfolgende Punkte in der Liste unterschiedlich sind.
Beispiele:
(0,0), (1,0) -> falsey
(0,0), (1,0), (0,0) -> truthy
(0,0), (1,0), (1,1), (0,0) -> truthy
(0,0), (2,0), (1,1), (1,-1) -> truthy
(0,0), (10,0), (0,1), (10,1), (0,2), (10,2) -> falsey
Beachten Sie, dass alle Koordinaten, die ich hier angegeben habe, Ganzzahlen sind. Möglicherweise unterstützen Sie Koordinateneingaben von beliebigen Werten aus {Ganzzahl, Dezimalzahl, Rational, Gleitkomma, ...}. Aber Ihre Implementierungsberechnungen müssen die richtigen Antworten für alle gegebenen Eingaben geben.
Antworten:
Python 2 ,
315309298382380372 BytesProbieren Sie es online!
Verwendet den Algorithmus von hier , kombiniert mit dieser SO-Antwort für kollineare Segmente.
Bearbeiten: Korrigiert für Liniensegmente, die in die gleiche Richtung verlaufen (z. B.
(0,0),(1,0),(2,0)
), indem der Mittelpunkt entfernt wird (was zur Folge hat(0,0),(2,0)
).quelle
*((n*N>0)+(m*M>0)<1)
->*(n*N<=0>=m*M)
.Eukleides ,
154148 BytesDie Funktion mit dem Namen
i
that 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,
intersection
nur 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
or
Anweisung neu anordnen , damit zuvor ein Leerzeichen entfernt werden kannor
. 5 weitere Bytes durch Ändern diesesif
Blocks in eine ternäre Operation.Testfälle:
quelle