Die Herausforderung besteht darin, anhand einer Liste von Punkten so zu sortieren, dass sie sich niemals überschneiden, wenn sie in dieser Reihenfolge verbunden sind.
Eingabeformat (von stdin gelesen):
X Y
1 2
3 4
5 6
...
Die Ausgabe sollte mit der Eingabe identisch sein, jedoch sortiert sein.
Regeln:
- Sie können von jedem Punkt aus beginnen.
- Der letzte Punkt muss mit dem ersten identisch sein, um einen engen Stromkreis zu bilden.
- Dies sollte unter Berücksichtigung des kartesischen Gitters erfolgen.
- Sie können davon ausgehen, dass die Eingabepunkte nicht alle auf einer einzelnen Linie liegen.
- Die Endpunkte jeder Linie gelten nicht als Schnittpunkte.
Für weitere Hilfe:
Antworten:
Mathematica -
2030 ZeichenNur der Sortierteil
Ganzer Testcode, der aus dem Generieren von 100 zufälligen Punkten und dem Zeichnen der Linie besteht
+26 Zeichen
Wenn Sie eine korrekte Eingabe / Ausgabe verlangen, dann
+2 Zeichen
Einfach hinzufügen
N@
weil der obige Code aufgrund des seltsamen Verhaltens von Mathematica beim Sortieren symbolischer Ausdrücke nur für reelle Zahlen und nicht für ganze Zahlen funktioniert
BEARBEITEN Ich habe gerade festgestellt, dass es nicht funktioniert, wenn sich die Punkte nicht um den Ursprung befinden. Daher muss auch in die Mitte der Punkte verschoben werden
quelle
ArcTan
Ergebnis bis zum letzten Bit identisch ist. Weißt du warum das so ist? (Hier ist ein solcher Fall, wenn Sie damit herumspielen möchten{{1, 2}, {2, 4}, {3, 6}, {-5, 5}, {-6, -12}, {5, -5}}
).SortBy
Dokumentation: Wenn einige der f [e_i] gleich sind, wird die kanonische Reihenfolge des entsprechenden e_i verwendet.Die Frage hat sich geändert, daher enthält diese Antwort verschiedene Versionen mit und ohne geschlossenen Pfad.
Perl, offener Pfad, 69 Bytes
Jeder Punkt wird in STDIN als Linie erwartet, wobei die Koordinaten durch Leerzeichen getrennt sind.
Es wird jedes Zahlenformat unterstützt, das Perl als Zahl interpretiert (einschließlich Gleitkommazahlen).
Beispiel:
Ausgabe:
Ungolfed:
Schaltungsvarianten
In der Version mit der ersten Frage gab es eine Verbindung zwischen dem letzten und dem ersten Punkt, um eine Schaltung herzustellen.
Zentrum ist nicht vorhanden Punkt, 253 Bytes
Diese Variante kann fehlschlagen, wenn die Mitte einer der Punkte ist, siehe Beispiel 3.
Bearbeitungen:
In seiner Antwort bemerkte Swish, dass die Punkte um den Ursprung zentriert sein sollten, um eine kreuzfreie Schaltung zu gewährleisten:
Fehlerbehebung: Der Sonderfall für die negative x-Achse hatte die positive x-Achse enthalten.
Beispiel 1:
Ausgabe 1:
Beispiel 2:
Testen der Zahlendarstellung und Koordinatentransformation.
Ausgabe 2:
Ungolfed:
Ohne Einschränkung 325 Bytes
In der vorherigen Version wird die Mitte am Anfang gesetzt und die letzten Punkte auf der negativen Achse werden in umgekehrter Reihenfolge sortiert, um wieder kreuzfrei zur Mitte zu gelangen. Dies reicht jedoch nicht aus, da die letzten Punkte auf einer anderen Linie liegen könnten. Somit würde das folgende Beispiel 3 fehlschlagen.
Dies wird behoben, indem der zentrierte Ursprung ein wenig nach oben und rechts verschoben wird. Aufgrund der Zentrierung muss mindestens ein Punkt mit positivem x-Wert und ein Punkt mit positivem y-Wert vorhanden sein. Somit werden die Minima der positiven x- und y-Werte genommen und auf ein Neuntel reduziert (ein halbes oder drittes könnte ausreichen). Dieser Punkt kann nicht einer der vorhandenen Punkte sein und wird zum neuen Ursprung gemacht.
Die speziellen Behandlungen des Ursprungs und der negativen x-Achse können entfernt werden, da es einen Punkt gibt, der auf dem neuen Ursprung liegt.
Beispiel 3:
Ausgabe 3:
Beispiel 1 ist jetzt anders sortiert:
Ungolfed:
quelle
GolfScript, 6/13 Zeichen (offener Pfad; 49 Zeichen für geschlossenen Pfad)
Der obige Code setzt voraus, dass die Ausgabe in einem beliebigen vernünftigen Format erfolgen kann. Wenn das Ausgabeformat mit der Eingabe übereinstimmen muss, reicht die folgende 13-stellige Version aus:
Erläuterung:
~
wertet die Eingabe aus und wandelt sie in eine Liste von Zahlen um;]
sammelt diese Zahlen in einem Array und2/
teilt dieses Array in Blöcke mit zwei Zahlen auf, die jeweils einen Punkt darstellen.$
sortiert die Punkte in lexikografischer Reihenfolge, dh zuerst nach der x-Koordinate und dann, wenn es Bindungen gibt, nach der y-Koordinate. Es ist leicht zu zeigen, dass dies garantiert, dass sich die zwischen den Punkten gezogenen Linien nicht schneiden, solange der Pfad nicht zum Anfang zurückgeschleift werden muss.`
Stringifiziert in der 5- stelligen Version das sortierte Array und erzeugt die native String-Darstellung davon (z[[0 0] [0 4] [4 0] [4 4]]
. B. ).{" "*n}/
Verbindet in der längeren Version die Koordinaten jedes Punkts durch ein Leerzeichen und fügt eine neue Linie hinzu.Online-Demo: Kurzversion / Langversion .
Ps. Hier ist eine 49-Zeichen-Lösung für das ursprüngliche Problem, bei dem der Pfad geschlossen werden muss:
Es funktioniert ähnlich wie die Perl-Lösung von Heiko Oberdiek , nur dass dieser Code anstelle der Triggerfunktionen die Punkte nach der Steigung ( y - y 0 ) / ( x - x 0 ) sortiert , wobei ( x 0 , y 0) ) ist der Punkt mit der niedrigsten x- Koordinate (und der niedrigsten y- Koordinate, wenn mehrere Punkte für das niedrigste x gebunden sind ).
Da GolfScript Gleitkomma nicht unterstützt, werden die Pisten durch die feste Konstante multipliziert 9 9 = 387420489. (Wenn das nicht genug Präzision ist, können Sie die ersetzen
9
mit ,99
um den Multiplikator in 99 99 ≈ 3,7 × 10 197 ) . Es ist auch etwas zusätzlichen Code, um Bindungen (durch die x- Koordinate) zu lösen und sicherzustellen, dass wie in Heikos Lösung Punkte mit x = x 0 zuletzt in absteigender Reihenfolge nach y- Koordinate sortiert werden .Auch hier ist eine Online-Demo .
quelle
Mathematica, 35
Dies funktioniert für JEDE Liste eindeutiger Punkte.
Sie sagen "read from stdin", also gehe ich für Mathematica von "read from last output" aus.
Eingabe (letzte Ausgabe):
Ausgabe:
Wenn Eingabe und Ausgabe nicht im Format "Zeilenumbrüche" erfolgen müssen, kann dies auf 6 Zeichen reduziert werden :
Nehmen Sie die letzte Ausgabe als Eingabe, vorausgesetzt, die letzte Ausgabe ist ein zweidimensionales Array.
Eingabe (letzte Ausgabe):
Ausgabe:
quelle
Sort
das Gleiche tun?SortBy
damit ich leicht nach den "x" -Werten und den "y" -Werten sortieren kann.StringSplit
erneut umbenennen und die Infix-Syntax verwendenSort@(s=StringSplit)@%~s~"\n"
.PHP (
175109100 Zeichen)OK, ich gebe zu, PHP ist nicht die beste Golfsprache, aber ich habe es versucht.
Hier einige Beispielausgaben:
Es werden die Informationen in eine Zeichenfolge eingefügt, die mit vorherigen Nullen formatiert ist.
Dann werden die Punkte nur textuell sortiert.
PS Es schlägt bei den obigen Zahlen fehl
9999
.quelle
Python 2.7, 42B
Einfacher geht es nicht. STDIN lesen, Zeilen sortieren, Zeilen drucken. NB Ich habe die genauen E / A-Anforderungen der Frage beachtet, aber wenn Sie STDIN manuell ausfüllen, müssen Sie drücken
CTRL+d
, um die Eingabe zu beenden.quelle