Do Pauli matryce są zbiorem macierzy 2x2, które występują bardzo powszechnie w fizyce kwantowej (nie, nie trzeba znać żadnych fizyki kwantowej do tego wyzwania). Jeśli uwzględnimy tożsamość w zestawie, cztery macierze to:
σ0 = σ1 = σ2 = σ3 =
[1 0] [0 1] [0 -i] [1 0]
[0 1] [1 0] [i 0] [0 -1]
Mnożąc dwa z nich zawsze daje inną Pauli matrycy, choć może zostać pomnożona przez jedną ze złożonych etapów 1
, i
, -1
, -i
. Na przykład .σ1σ3 = -iσ2
Twoim zadaniem jest pomnożenie wielu macierzy Pauliego i zwrócenie wynikowej macierzy i fazy. Wejście zostanie podany jako niepusty ciąg cyfr 0
do 3
reprezentującą matryce do . Wyjście powinno być łańcuch zawierający pojedynczy cyfrę macierzy wynikowej, ewentualnie przed , lub w celu wskazania fazy ( jest ).σ0
σ3
i
-
-i
-
-1
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i wypisując wynik przez STDOUT (lub najbliższą alternatywę), wartość zwracaną funkcji lub parametr funkcji (wyjściowej).
Nie wolno używać żadnych wbudowanych (lub zewnętrznych) funkcji związanych z matrycami Pauli.
To jest kod golfowy, wygrywa najkrótsza odpowiedź (w bajtach).
Przypadki testowe
1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1
źródło
Odpowiedzi:
Pyth, 47 bajtów
Wydaje mi się, że nadal można grać w golfa. Ale to znacznie przewyższa CJam.
Wypróbuj online: pakiet demonstracyjny lub testowy
Wyjaśnienie
Ustalenie wynikowego typu macierzy polega po prostu na umieszczeniu wszystkich liczb.
Podczas mnożenia 2 macierzy
A*B
, faza zmienia się, jeśli nie macierzą jestσ0
iA != B
.źródło
Python 2,
108898786 bajtów(Podziękowania dla @grc i @xnor za pomoc)
Wyjaśnienie
Podzielmy współczynnik i macierz podstawową. Jeśli skupimy się tylko na macierzy podstawowej, otrzymamy tę tabliczkę mnożenia (np.
13
Jest-i2
, więc wstawiamy2
):co po prostu dzieje się tak samo jak bitowe xor.
Teraz skupmy się na współczynnikach. Jeśli pozwolimy odpowiednio
0123
oznaczać1,i,-1,-i
, otrzymamy:W tym celu najpierw sprawdzamy, czy któraś z tych liczb wynosi 0
m*y
, dbając o lewą kolumnę i górny wiersz. Dodanie(m-y)%3
następnie daje:co jest bliskie, tyle że
2
zamiast tego mamy3
. Rozliczamy to poprzez wykonanie*3/2
.Do indeksowania zauważamy, że jeśli weźmiemy ciąg
"--i"
i wybieramy co drugi znak, zaczynając od indeksów0123
, otrzymujemy"-i","-","i",""
.źródło
3-n%4
tak~n%4
. Podejrzewam, że możesz wyrazićm*y and(m-y)%3*3/2
krócej za pomocą magicznego sznurka, ale moja pierwsza próba była877449216>>2*m+8*y
tylko powiązana. Istnieje również dość algebraiczna formuła, któraY=m^y
brzmi(m-y)*(y-Y)*(Y-m)/2
, ale jeśli tak, to długo.~
, fajnie - denerwujące mnie było denerwujące: / Jestem pewien, żem*y and(m-y)%3*3/2
można je również skrócić, ale spędziłem całą noc i nigdzie nie dotarłem ... wrócę do tego, jeśli Mieć czas. Może fakt, że mam mod wolności 4, może pomóc.Siatkówka , 77 bajtów
Pomyślałem, że wykorzystam tę okazję, aby pochwalić się nową funkcją Retina: pętle wieloetapowe. Powinno to znacznie skrócić wiele zadań (zwłaszcza zastępowanie warunkowe).
Retina jest moim własnym językiem programowania opartym na wyrażeniach regularnych. Kod źródłowy można pogrupować w etapy: każdy etap składa się z dwóch wierszy, w których pierwszy zawiera wyrażenie regularne (i potencjalnie pewną konfigurację), a drugi wiersz to ciąg zastępujący. Etapy są następnie nakładane na STDIN w kolejności, a wynik końcowy jest drukowany na STDOUT.
Możesz użyć powyższego bezpośrednio jako pliku źródłowego za pomocą
-s
przełącznika wiersza poleceń. Jednak nie liczę przełącznika, ponieważ możesz również po prostu umieścić każdą linię w osobnym pliku (wtedy tracisz 15 bajtów dla nowych linii, ale dodajesz +15 dla dodatkowych plików).Wyjaśnienie
Nowością w tym rozwiązaniu jest
)
etap przedostatni. To zamyka wieloetapową pętlę. Brak dopasowania(
, co oznacza, że pętla domyślnie rozpoczyna się na pierwszym etapie. Dlatego pierwsze 7 etapów powtarza się, aż pełne przejście przez wszystkie 7 z nich przestanie zmieniać wynik. Te 7 etapów po prostu wykonuje różne transformacje, które stopniowo zmniejszają liczbę matryc w łańcuchu i łączą fazy. Po osiągnięciu ostatecznego wyniku żaden z siedmiu wzorów już się nie zgadza i pętla się kończy. Następnie dodajemy 0, jeśli w wyniku nie ma jeszcze cyfry (ponieważ powyższe etapy po prostu usuwają wszystkie tożsamości, w tym wynik).Oto, co robią poszczególne etapy:
Łączy wszystkie pary
i
w,-
aby zmniejszyć znaki fazy.Teraz, jeśli pozostały dwa kolejne identyczne znaki, jest to jedna
--
lub dwie identyczne macierze. W obu przypadkach pomnożenie ich daje tożsamość. Ale nie potrzebujemy tożsamości, więc po prostu usuwamy je wszystkie, a także tożsamości jawne0
. Ten etap powtarza się sam z,+
aż wynik przestanie się zmieniać. Zapewnia to123321
całkowite rozwiązanie takich problemów , że w następnym kroku można założyć, że wszystkie pary cyfr są różne.To właściwie dwie osobne transformacje w jednym (dla golfitude). Zauważ, że jeśli pierwsza alternatywa pasuje
$2
i$3
są puste, a jeśli druga pasuje,$1
jest pusta. Można to rozłożyć na następujące dwa kroki:To po prostu zamienia wszystkie pary cyfr i dodaje znak minus. Ponieważ usunęliśmy wszystkie
0
s i wszystkie identyczne pary, to będzie tylko dopasować12
,23
,31
,21
,32
,13
. Ten krok może wydawać się dziwny, ale pozwala mi później sprawdzić tylko połowę tych przypadków, ponieważ te, których nie mogę przetworzyć, zostaną zamienione tutaj w następnej iteracji.Drugą częścią powyższego etapu było:
Powoduje to stopniowe przesuwanie
-
znaków do końca w lewo (jedna pozycja na iterację). Robię to tak, aby ostatecznie wszyscy byli obok siebie i zostali rozwiązani na wcześniejszym etapie.Te trzy etapy rozwiązują teraz po prostu trzy pary produktów. Jak powiedziałem powyżej, będzie to obejmować tylko połowę odpowiednich przypadków, ale druga połowa zostanie załatwiona w następnej iteracji, po tym, jak poprzedni krok zamienił wszystkie pary.
To ostatni etap pętli. Jest podobny do tego, który przesuwa
-
się w lewo, z wyjątkiemi
. Główną różnicą jest to, że zamienia sięi
tylko cyframi. Gdybym używał,(.)i
to w przypadkach, w których dostaję jeden-i
lubi-
dwa, zostałyby zamienione na czas nieokreślony, a program nie zakończyłby się. To zamienia je tylko na prawo od-
znaków. Jest to wystarczające - tak długo, jak wszyscy-
ii
pojawiają się razem w pewnym momencie, mogą zostać rozwiązane poprawnie.Ostatni krok (poza pętlą). Pamiętaj, że zawsze usuwaliśmy wszystkie tożsamości, więc jeśli wynikiem jest tożsamość (razy faza), to nie będziemy już mieć wymaganej cyfry na wyjściu, więc dodajemy ją z powrotem.
Na przykład tutaj są wszystkie pośrednie formy
0223202330203313021301011023230323
(pomijanie etapów, które nie powodują żadnych zmian):źródło
CJam,
5856 bajtówJestem pewien, że można w to dużo grać w golfa, ale oto:
Wypróbuj online tutaj lub uruchom pełny pakiet tutaj
źródło