Die Pauli-Matrizen sind eine Menge von 2x2-Matrizen, die in der Quantenphysik sehr häufig vorkommen (nein, Sie müssen für diese Herausforderung keine Quantenphysik kennen). Wenn wir die Identität in die Menge aufnehmen, sind die vier Matrizen:
σ0 = σ1 = σ2 = σ3 =
[1 0] [0 1] [0 -i] [1 0]
[0 1] [1 0] [i 0] [0 -1]
Multipliziert man zwei von ihnen werden immer eine andere Pauli - Matrix geben, obwohl es von einem der komplexen Phasen multipliziert werden kann 1
, i
, -1
, -i
. Zum Beispiel .σ1σ3 = -iσ2
Ihre Aufgabe ist es, eine Anzahl von Pauli-Matrizen zu multiplizieren und die resultierende Matrix und Phase zurückzugeben. Die Eingabe erfolgt als nicht leere Ziffernfolge 0
zur 3
Darstellung der Matrizen bis . Die Ausgabe sollte eine Zeichenkette sein , eine einzelne Stelle für die resultierende Matrix enthält, die gegebenenfalls mit vorangestellter , oder der Phase , um anzuzeigen ( für ).σ0
σ3
i
-
-i
-
-1
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Sie dürfen keine integrierten Funktionen (oder Funktionen von Drittanbietern) in Bezug auf Pauli-Matrizen verwenden.
Dies ist Codegolf, die kürzeste Antwort (in Bytes) gewinnt.
Testfälle
1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1
quelle
Antworten:
Pyth, 47 Bytes
Ich denke, das ist immer noch Golf. Aber es schlägt CJam um einiges.
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung
Das Bestimmen des resultierenden Matrixtyps ist einfach das Xoring aller Zahlen.
Beim Multiplizieren von 2 Matrizen
A*B
ändert sich die Phase, wenn nicht eine der Matrizen istσ0
undA != B
.quelle
Python 2,
108898786 Bytes(Danke an @grc und @xnor für die Hilfe)
Erläuterung
Teilen wir den Koeffizienten und die Basismatrix auf. Wenn wir nur auf die Grundmatrix konzentrieren, bekommen wir diese Multiplikationstabelle (zB
13
ist-i2
, so dass wir setzen2
):das ist einfach das gleiche wie bitweises xor.
Konzentrieren wir uns nun auf die Koeffizienten. Wenn wir jeweils
0123
bezeichnen lassen1,i,-1,-i
, erhalten wir:Dazu prüfen wir zunächst, ob eine der beiden Zahlen 0 ist
m*y
, und achten dabei auf die linke Spalte und die obere Reihe. Hinzufügen(m-y)%3
ergibt dann:die Nähe, mit der Ausnahme , dass wir
2
statt3
. Wir tragen dem durch Leistung Rechnung*3/2
.Bei der Indizierung stellen wir fest, dass, wenn wir die Zeichenfolge nehmen
"--i"
und jedes zweite Zeichen auswählen, beginnend mit den Indizes, die0123
wir erhalten"-i","-","i",""
.quelle
3-n%4
wie~n%4
. Ich vermute man kannm*y and(m-y)%3*3/2
kürzer in einer magischen Saite ausdrücken , aber mein erster Versuch ist877449216>>2*m+8*y
nur gebunden. Es gibt auch eine ziemlich algebraische Formel, dass wennY=m^y
, der Ausdruck ist(m-y)*(y-Y)*(Y-m)/2
, aber das ist lang.~
, schön - der Off-by-One hat mich genervt : / Ich bin mir ziemlich sicher,m*y and(m-y)%3*3/2
dass ich mich auch verkürzen kann, aber ich habe die ganze Nacht verbracht und bin nirgendwo hingekommen ... Ich werde darauf zurückkommen, wenn ich Zeit haben. Vielleicht könnte die Tatsache, dass ich Freedom Mod 4 habe, helfen.Retina , 77 Bytes
Ich dachte, ich würde diese Gelegenheit nutzen, um ein neues Retina-Feature vorzuführen: mehrstufige Loops. Dies sollte viele Aufgaben erheblich verkürzen (insbesondere den bedingten Austausch).
Retina ist meine eigene, auf Regex basierende Programmiersprache. Der Quellcode kann in Phasen gruppiert werden: Jede Phase besteht aus zwei Zeilen, wobei die erste die Regex (und möglicherweise eine Konfiguration) enthält und die zweite Zeile die Ersatzzeichenfolge ist. Die Stufen werden dann der Reihe nach auf STDIN angewendet, und das Endergebnis wird auf STDOUT gedruckt.
Sie können die oben genannten direkt als Quelldatei mit der
-s
Befehlszeilenoption verwenden. Ich zähle den Schalter jedoch nicht, da Sie auch einfach jede Zeile in eine separate Datei einfügen können (dann verlieren Sie 15 Byte für die Zeilenumbrüche, fügen jedoch +15 für die zusätzlichen Dateien hinzu).Erläuterung
Das Neue an dieser Lösung ist
)
das vorletzte Stadium. Dies schließt eine mehrstufige Schleife. Es gibt keine Übereinstimmung(
, was bedeutet, dass die Schleife implizit in der ersten Stufe beginnt. Daher werden die ersten 7 Stufen wiederholt, bis ein vollständiger Durchlauf durch alle 7 das Ergebnis nicht mehr ändert. Diese 7 Stufen führen einfach verschiedene Transformationen durch, die die Anzahl der Matrizen in der Kette allmählich verringern und die Phasen kombinieren. Sobald wir das Endergebnis erreicht haben, stimmt keines der sieben Muster mehr überein und die Schleife endet. Danach fügen wir eine 0 hinzu, wenn das Ergebnis noch keine Ziffer enthält (da in den obigen Schritten einfach alle Identitäten einschließlich des Ergebnisses gelöscht werden).Das machen die einzelnen Stufen:
Kombiniert alle Paare von
i
in-
, um die Phasenzeichen zu reduzieren.Wenn nun zwei aufeinanderfolgende identische Zeichen übrig sind, sind es entweder
--
zwei identische Matrizen. In beiden Fällen ergibt die Multiplikation die Identität. Wir brauchen aber keine Identitäten, also entfernen wir einfach alle und auch die expliziten Identitäten0
. Diese Phase wird in sich wiederholt,+
bis sich das Ergebnis nicht mehr ändert. Dies stellt sicher, dass Dinge wie123321
vollständig aufgelöst werden, sodass der nächste Schritt davon ausgehen kann, dass alle Ziffernpaare unterschiedlich sind.Dies sind eigentlich zwei getrennte Transformationen in einer (für Golf). Beachten Sie, dass, wenn die erste Alternative zutrifft
$2
und$3
leer ist, und wenn die zweite zutrifft,$1
leer ist. Das kann also in diese zwei Schritte zerlegt werden:Dadurch werden nur alle Ziffernpaare vertauscht und ein Minuszeichen hinzugefügt. Da wir alle entfernt
0
s und alle identische Paare, wird dies nur passen12
,23
,31
,21
,32
,13
. Dieser Schritt mag seltsam erscheinen, aber ich kann später nur die Hälfte dieser Fälle überprüfen, da diejenigen, die ich dann nicht verarbeiten kann, in der nächsten Iteration hier ausgetauscht werden.Der andere Teil der obigen Etappe war:
Dadurch werden die
-
Zeichen schrittweise ganz nach links verschoben (eine Position pro Iteration). Ich mache das so, dass sie letztendlich alle nebeneinander stehen und im vorherigen Schritt gelöst werden.Diese drei Stufen lösen nun einfach die drei Produktpaare auf. Wie ich oben sagte, wird dies nur die Hälfte der relevanten Fälle erfassen, aber die andere Hälfte wird in der nächsten Iteration behoben, nachdem der vorherige Schritt alle Paare vertauscht hat.
Dies ist die letzte Stufe der Schleife. Es ist ähnlich wie das, das sich
-
nach links verschiebt, mit Ausnahme voni
. Der Hauptunterschied ist, dass dieseri
nur mit Ziffern vertauscht wird. Wenn ich(.)i
dann in Fällen verwendet, in denen ich ein-i
oderi-
die zwei bekomme, würde auf unbestimmte Zeit getauscht und das Programm würde nicht beendet. Das vertauscht sie also nur rechts von den-
Zeichen. Dies ist ausreichend - solange alle-
undi
zu einem bestimmten Zeitpunkt zusammen angezeigt werden, können sie korrekt aufgelöst werden.Der letzte Schritt (außerhalb der Schleife). Denken Sie daran, dass wir immer alle Identitäten gelöscht haben. Wenn das Ergebnis also tatsächlich die Identität ist (mal eine Phase), haben wir die erforderliche Ziffer nicht mehr in der Ausgabe, also fügen wir sie zurück.
Als Beispiel sind hier alle Zwischenformen von
0223202330203313021301011023230323
(Überspringen von Phasen, die keine Änderungen durchführen):quelle
CJam,
5856 BytesIch bin mir sicher, dass man hier viel Golf spielen kann, aber hier ist es:
Probieren Sie es hier online aus oder führen Sie die komplette Suite hier aus
quelle