Wenn Sie es noch nicht wissen, ist eine Quaternion im Grunde eine 4-teilige Nummer. Für die Zwecke dieser Herausforderung besteht sie aus einer realen Komponente und drei imaginären Komponenten. Die imaginären Komponenten durch das Suffix dargestellt sind i
, j
, k
. Zum Beispiel 1-2i+3j-4k
ist eine Quaternion mit 1
der realen Komponente und mehr -2
, 3
und -4
die imaginären Komponenten zu sein.
In dieser Herausforderung müssen Sie die Zeichenfolgenform eines Quaternions (z. B. "1+2i-3j-4k"
) in eine Liste / ein Array von Koeffizienten (z. B. [1 2 -3 -4]
) zerlegen . Die Quaternion-Zeichenfolge kann jedoch auf viele verschiedene Arten formatiert werden ...
- Es kann normal sein:
1+2i-3j-4k
- Es können fehlende Begriffe:
1-3k
,2i-4k
(Wenn Sie fehlende Begriffe, Ausgabe0
für diese Begriffe) - Es kann hat Koeffizienten fehlen:
i+j-k
(In diesem Fall ist dies gleichbedeutend mit1i+1j-1k
anderen Worten, a.i
,j
Oderk
ohne eine Zahl vor angenommen wird , eine haben ,1
standardmäßig vor) - Möglicherweise ist die Reihenfolge nicht richtig:
2i-1+3k-4j
- Die Koeffizienten können einfache Ganzzahlen oder Dezimalzahlen sein:
7-2.4i+3.75j-4.0k
Beim Parsen sind einige Dinge zu beachten:
- Es wird immer ein
+
oder-
zwischen den Begriffen geben - Sie erhalten immer eine gültige Eingabe mit mindestens einem Begriff und ohne wiederholte Buchstaben (keine
j-j
). - Es kann davon ausgegangen werden, dass alle Zahlen gültig sind
- Sie können Zahlen in einer anderen Form ändern , nachdem das Parsen , wenn Sie wollen (ex.
3.0 => 3
,0.4 => .4
,7 => 7.0
)
Parsing / Quaternion-Builtins und Standard-Lücken sind nicht zulässig. Dies beinhaltet eval
Schlüsselwörter und Funktionen. Die Eingabe ist eine einzelne Zeichenfolge, und die Ausgabe ist eine Liste, ein Array, durch Leerzeichen getrennte Werte usw.
Da es sich um Code-Golf , kürzeste Code in Bytes gewinnt.
Tonnenweise Testfälle
1+2i+3j+4k => [1 2 3 4]
-1+3i-3j+7k => [-1 3 -3 7]
-1-4i-9j-2k => [-1 -4 -9 -2]
17-16i-15j-14k => [17 -16 -15 -14]
7+2i => [7 2 0 0]
2i-6k => [0 2 0 -6]
1-5j+2k => [1 0 -5 2]
3+4i-9k => [3 4 0 -9]
42i+j-k => [0 42 1 -1]
6-2i+j-3k => [6 -2 1 -3]
1+i+j+k => [1 1 1 1]
-1-i-j-k => [-1 -1 -1 -1]
16k-20j+2i-7 => [-7 2 -20 16]
i+4k-3j+2 => [2 1 -3 4]
5k-2i+9+3j => [9 -2 3 5]
5k-2j+3 => [3 0 -2 5]
1.75-1.75i-1.75j-1.75k => [1.75 -1.75 -1.75 -1.75]
2.0j-3k+0.47i-13 => [-13 0.47 2.0 -3] or [-13 .47 2 -3]
5.6-3i => [5.6 -3 0 0]
k-7.6i => [0 -7.6 0 1]
0 => [0 0 0 0]
0j+0k => [0 0 0 0]
-0j => [0 0 0 0] or [0 0 -0 0]
1-0k => [1 0 0 0] or [1 0 0 -0]
quelle
+
Zeichen in der Eingabe geben? Wie+1k
:?+
.-0
ein Teil der rechtlichen Ergebnisse für die letzten beiden Beispiele?eval
Einschränkung, die in einer Zeichenfolge verwendet werden soll, und interpretieren Sie diese als Code und / oder Eingabe. Alle Konvertierungen zählen nicht darunter, weil Sie beispielsweise die Zeichenfolge nicht"test"
an eine Ganzzahl-Konvertierungsfunktion übergeben können, um eine Ganzzahl zu erhalten, sonderntest
in einer normaleneval
Funktion als Code interpretiert würden . TLDR: eval: nein, Typkonvertierungen: ja.Antworten:
Pyth, 48 Bytes
Demonstration Testsuite
Das Ausgabeformat ist durch Zeilenumbrüche getrennt. Der Code der Testsuite verwendet eine Leerzeichen-Trennung, um das Lesen zu erleichtern, ist aber ansonsten derselbe.
Gibt
-0
in den letzten 2 Fällen ein aus, was ich hoffe ist OK.Erklärung folgt.
quelle
Retina, 115
Probieren Sie es online!
Dank @Chris Jester-Young 1 Byte gespart .
Ein Bug behoben und 6 Bytes gespart dank @Martin Büttner
Es wurden einige Fehler gefunden, die einige Randfälle betrafen.
Gibt die durch Zeilenumbrüche getrennten Zahlen zurück. Wie auch immer, dies ist eine meist elegante Lösung, die durch Kantenfälle ruiniert wird, aber hey, ich muss den Sortiermodus verwenden, das heißt, ich habe das richtige Werkzeug für den Job verwendet, oder?
Erläuterung:
Schritt für Schritt, wie immer.
Die einzigen Zeichen in der Eingabe, die Wortgrenzen erstellen können, sind
-+.
. Das heißt, wenn wir eine Grenze finden, der ein Buchstabe folgt, haben wir einen Implizit,1
den wir mit der Ersetzung hinzufügen.$&
ist ein Synonym für$0
.Vielen Dank an Martin für diesen einen, dieser fügt den impliziten Teil
0
für den Realteil hinzu, wenn er in der Eingabe fehlte. Wir stellen sicher, dass wir keine Zahl finden, auf die ein Plus- oder Minuszeichen oder das Ende der Zeichenfolge folgt. Alle komplexen Zahlen haben einen Buchstaben nach sich.Die nächsten drei Stufen sind fast alle gleich, es sei denn, auf welchen Buchstaben sie sich auswirken. Alle sehen nach, ob wir den Buchstaben nicht finden können, und wenn wir ihn nicht finden können, fügen wir einen
0
Begriff hinzu. Der einzige Grund, warumi
es ein Extra gibt+
, ist zu verhindern, dass der reale Wert mit demi
s-Koeffizienten unlesbar wird. Die anderen Zahlen werden alle durch ihre komplexe Variable getrennt.Ah, der lustige Teil. Dies verwendet die neue Sortierstufe, die durch das
O
Backtick vor dem Optionstrennzeichen gekennzeichnet ist. Der Trick dabei ist, die ganze Zahl zu erfassen, gefolgt von einem optionalen Wortzeichen, das in diesem Fall immer nur einem von beiden entsprichtijk
. Die andere verwendete Option$
bewirkt, dass der zum Sortieren dieser Übereinstimmungen verwendete Wert der Ersatz ist. Hier verwenden wir nur den optionalen Buchstaben als Sortierwert. Da Retina standardmäßig lexikografisch sortiert, werden die Werte wie in einem Wörterbuch sortiert, was bedeutet, dass wir die Übereinstimmungen in der richtigen"", "i", "j", "k"
Reihenfolge erhalten.Diese Phase setzt ein
+
Vorzeichen vor alle Minuszeichen. Dies ist erforderlich, wenn wiri
später in der Teilungsphase einen negativen Wert für haben .Wir entfernen die
+
führenden Zeilen, um sicherzustellen, dass keine zusätzlichen führenden Zeilen vorhanden sind.Teilen Sie die verbleibenden Zeilen in Läufen der komplexen Variablen oder des Pluszeichens. Dies gibt uns einen Wert pro Zeile.
quelle
Perl 5, 125 Bytes
quelle
\a
stimmt Perl mit "Alarm" überein, nicht alphabetisch. Es gibt\w
für Wortzeichen (alphanumerisch und Unterstrich), aber das wird hier nicht funktionieren; Wir brauchen es nicht, um auf eine Zahl zu passen.Lua ,
185187195183166 Bytes ( online testen) [Regex verwendet]Vielen Dank an @Chris Jester-Young für den verbesserten Regex.
Vielen Dank an @Katenkyo für die Reduzierung auf 166 Bytes.
Golf gespielt:
Ungolfed:
quelle
n
in diesem Fall), daher sollten Sie den Code hinzufügen, um die Eingabe zu lesen.io.read()
use zu verwenden(...)
. Es wird auf das erste Befehlszeilenargument verweisen und Sie können 4 weitere Bytes speichern :)r={0,0,0,0}for u in(...):gsub("([+-])(%a)","%11%2"):gmatch("-?[%d.]+%a?")do n,i=u:match("(.+)(%a)")r[i and(" ijk"):find(i)or 1]=(n or u)end print(table.concat(r," "))
C 236 Bytes
(Bei Werten wie -0 oder -0.0 wird das Minuszeichen auch in der Ausgabe ausgegeben.
Da die Abfrage jedoch besagt, dass "Sie Zahlen nach dem Parsen in eine andere Form ändern können, wenn Sie möchten", und wenn -0 in der Eingabe angezeigt wird,Darausfolgt, dass es auch in der Ausgabeakzeptabel ist.@GamrCorps hat jetzt klargestellt, dass diesinOrdnung ist.)quelle
JavaScript (ES6),
103100 BytesBearbeiten: 3 Bytes durch Umschalten von
parseInt
auf gespeichertcharCodeAt
, was praktisch ist&3
, um mir den richtigen Array-Index zu beschaffen.quelle
JavaScript (ES6) 106
Prüfung
quelle
PowerShell, 178 Byte
Ungolfed mit Erklärung
Nicht super beeindruckt, aber es ist trotzdem ein Ergebnis.
quelle
PHP, 179 Bytes
Probieren Sie die Testsuite aus .
quelle
Python 3.5 - 496 Bytes [mit regulären Ausdrücken]:
Es mag lange dauern, aber zu meiner Verteidigung funktioniert es perfekt, um das zu tun, was das OP will, da alle angegebenen Testfälle mit meinem Code erfolgreich waren.
Ungolfed-Version mit Erklärung:
Wenn das oben Genannte etwas zu schwer zu lesen ist, geschieht im Grunde Folgendes:
Falls vorhanden, werden alle + oder - Zeichen, denen KEINE Zahl folgt, durch "+1" / "- 1" ersetzt.
Es
lambda
ist eine Funktion definiert, die bei Verwendung in einersorted
Funktion als Schlüssel die Liste nach der ersten Ganzzahl sortiert und den Rest in aufsteigender Reihenfolge der Buchstaben sortiert ("i", dann "j", dann "k"). in diesem Fall).Die Quaternion, in der jetzt bei Bedarf alle +/- Zeichen durch eine 1 ersetzt sind, wird unter Verwendung regulärer Ausdrücke nach ALLEN Buchstaben durchsucht, denen NICHT mindestens eine Ziffer vorausgeht, und die übereinstimmenden Buchstaben werden durch ein "+1" gefolgt von ersetzt dieser Brief.
Die "if" -Anweisung ersetzt dann ALL +/- -Zeichen durch ein Leerzeichen, und das geänderte Quaternion wird nun an diesen Leerzeichen "aufgeteilt" und in einer Liste zurückgegeben. Anschließend wird die Liste nach der zuvor erläuterten Lambda-Funktion sortiert. Schließlich wird das erste Element in dieser Liste überprüft, um sicherzustellen, dass es sich um eine Zahl handelt, da dies der Fall sein soll. Wenn dies nicht der Fall ist, wird der Quaternion ein "+0" hinzugefügt.
Die zweite "for" -Schleife findet ALLE Buchstaben, die NICHT in der Quaternion enthalten sind, indem eine symmetrische Differenz zwischen einer Menge der im Ausdruck gefundenen Buchstaben und einer Menge mit allen erforderlichen Buchstaben ermittelt wird. Wenn welche gefunden werden, wird ein "+0" gefolgt vom fehlenden Buchstaben und einem Leerzeichen zum Quaternion hinzugefügt.
Schließlich wird in diesem letzten Schritt zwischen jedem Zeichen ein "," gefolgt von einem +/- Symbol eingefügt. Anschließend wird die Quaternion an diesen Stellen aufgeteilt. Anschließend wird die zurückgegebene Liste zum letzten Mal nach sortiert Lambda-Funktion wurde früher als "q" definiert. Die Kommas im Ausdruck trennen jeden Teil des Quaternions (andernfalls erhalten Sie so etwas wie
14i+5j+6k
von4i+5j+6k+1
). Zuletzt wird diese nun sortierte Liste zu einer Zeichenfolge zusammengefügt, und nur die Zahlen eines beliebigen Typs (mit freundlicher Genehmigung von regulären Ausdrücken) werden extrahiert und schließlich jedes Mal in der richtigen Reihenfolge in einer Liste zurückgegeben.quelle