Die Wicklungszahl ist die ganze Zahl der Nettoumdrehungen gegen den Uhrzeigersinn, die ein Beobachter gemacht haben muss, um einem bestimmten geschlossenen Pfad zu folgen. Beachten Sie, dass alle Umdrehungen im Uhrzeigersinn negativ für die Wicklungszahl sind. Der Pfad darf sich selbst kreuzen.
Einige Beispiele (schamlos aus Wikipedia entnommen) sind nachfolgend aufgeführt:
Ihr Ziel ist es, die Windungszahl für einen bestimmten Pfad zu berechnen.
Eingang
Es wird angenommen, dass sich der Beobachter am Ursprung befindet (0,0)
.
Die Eingabe ist eine endliche Folge von Punkten (paarweise ganze Zahlen) aus einer beliebigen Eingabequelle, die den stückweisen linearen Pfad beschreibt. Falls gewünscht, können Sie dies zu einer 1D-Folge von Ganzzahlen reduzieren und die Eingabe so verschieben, dass alle x-Koordinaten vor allen y-Koordinaten verwendet werden. Sie können die Eingabe auch als komplexe Zahl annehmen a+b i
. Der Pfad kann sich selbst schneiden und Segmente mit der Länge Null enthalten. Der erste Punkt ist der Anfang des Pfades und liegt vermutlich irgendwo auf der positiven x-Achse.
Kein Teil des Pfades schneidet den Ursprung. Der Pfad wird immer geschlossen (dh der erste und der verlorene Punkt sind gleich). Ihr Code kann entweder den letzten Punkt implizieren oder erfordern, dass er enthalten ist.
Abhängig von Ihrer Präferenz geben beide Eingaben beispielsweise dasselbe Quadrat an:
impliziter Endpunkt
1,0
1,1
-1,1
-1,-1
1,-1
expliziter Endpunkt
1,0
1,1
-1,1
-1,-1
1,-1
1,0
Ausgabe
Die Ausgabe ist eine einzelne Ganzzahl für die Wicklungsnummer. Dies kann eine beliebige Quelle sein (Rückgabewert, Standardausgabe, Datei usw.).
Beispiele
In allen Beispielen ist der Endpunkt explizit definiert und als x, y-Paare angegeben. Im Übrigen sollten Sie in der Lage sein, diese Beispiele auch direkt in Codes einzugeben, die implizit definierte Endpunkte voraussetzen, und die Ausgaben sollten dieselben sein.
1. Grundtest
1,0
1,1
-1,1
-1,-1
1,-1
1,0
Ausgabe
1
2. Wiederholter Punkttest
1,0
1,0
1,1
1,1
-1,1
-1,1
-1,-1
-1,-1
1,-1
1,-1
1,0
Ausgabe
1
3. Test im Uhrzeigersinn
1,0
1,-1
-1,-1
-1,1
1,1
1,0
Ausgabe
-1
4. Außerhalb des Tests
1,0
1,1
2,1
1,0
Ausgabe
0
5. Gemischte Wicklung
1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,-1
-1,-1
-1,1
1,1
1,0
1,1
-1,1
-1,-1
1,-1
1,0
1,1
-1,1
-1,-1
1,-1
1,0
Ausgabe
2
Wertung
Das ist Code Golf; kürzester Code gewinnt. Es gelten Standardlücken. Sie können alle integrierten Funktionen verwenden, sofern diese nicht speziell für die Berechnung der Wicklungsnummer entwickelt wurden.
"1-i"
oder"1-1i"
?)Antworten:
ES6, 83 Bytes
Nimmt als Eingabe ein Array von Punktpaaren, die als komplexe Zahlen interpretiert werden. Anstatt jeden Punkt in einen Winkel umzuwandeln, werden die Punkte durch den vorherigen Punkt geteilt, den Math.atan2 dann in einen Winkel zwischen -π und π umwandelt, um so automatisch zu bestimmen, in welche Richtung sich der Pfad windet. Die Summe der Winkel ist dann 2π mal die Wicklungszahl.
Da es Math.atan2 nicht um den Umfang seiner Argumente geht, führe ich nicht die vollständige Division durch,
z / w = (z * w*) / (w * w*)
sondern multipliziere einfach jeden Punkt mit dem komplexen Konjugat des vorherigen Punkts.Bearbeiten: 4 Bytes dank @ edc65 gespeichert.
quelle
reduce
aber fast immer eine schlechte Wahl.a=>a.map(([x,y])=>r+=Math.atan2(y*b-x*c,y*c+x*b,b=x,c=y),b=c=r=0)&&r/Math.PI/2
Verwenden Sie stattdessen die Karte oder reduzieren Sie sie. Sie haben trotzdem meine Stimmereduce
weil mir nicht klar war, dass Math.atan2 (0,0) 0 ist. (Nun, es hängt davon ab, ob eine Ihrer 0en tatsächlich -0 ist.) Die Mathematik basiert auf einer komplexen Division, die normalerweise wie folgt berechnet wirdz / w = z * w* / |w|²
, aber die Größe ist mir egal, also ist es nur die Multiplikation mit dem komplexen Konjugat. Ebenfalls leicht verwirrend akzeptiert Math.atan2 (y, x) Argumente.MATL , 11 Bytes
Die Eingabe ist eine Folge komplexer Zahlen einschließlich des Endpunkts.
Probieren Sie es online!
Erläuterung
Die meiste Arbeit erledigt die
Z/
Funktion (unwrap
), die Winkel im Bogenmaß auspackt, indem absolute Sprünge größer oder gleich pi auf ihr 2 * pi-Komplement geändert werden.quelle
Jelly, 11 Bytes
Dies nimmt Eingaben als eine Liste von y-Koordinaten und eine Liste von x-Koordinaten entgegen.
Probieren Sie es hier aus .
quelle
Python, 111
Längste Antwort bis jetzt. Meine Motivation ist, 1) Python zu lernen und 2) dies möglicherweise auf Pyth zu übertragen.
Die Eingabe erfolgt als Liste komplexer Zahlen.
Ideone.
Ich denke, der Ansatz ähnelt der Antwort von ES6.
Wenn 2 komplexe Zahlen multipliziert werden, ist das Argument oder die Phase des Produkts die Summe des Arguments oder der Phase der beiden Zahlen. Wenn also eine komplexe Zahl durch eine andere geteilt wird, ist die Phase des Quotienten die Differenz zwischen den Phasen des Zählers und des Nenners. So können wir für jeden Punkt und den nächsten Punkt den durchfahrenen Winkel berechnen. Summiere diese Winkel und dividiere durch 2π ergibt die erforderliche Wicklungszahl.
quelle