파울리 행렬은 양자 물리학에서 매우 일반적으로 표시되는 2 × 2 행렬의 집합입니다 (아니, 당신은이 문제에 대한 양자 물리학을 알 필요가 없습니다). 집합에 항등을 포함하면 네 가지 행렬은 다음과 같습니다.
σ0 = σ1 = σ2 = σ3 =
[1 0] [0 1] [0 -i] [1 0]
[0 1] [1 0] [i 0] [0 -1]
승산 이 복잡한 위상 중 하나에 의해 승산 될 수 있지만 항상 다른 파울리 매트릭스를 제공 이들 중 둘 1
, i
, -1
, -i
. 예를 들어 .σ1σ3 = -iσ2
당신의 임무는 많은 Pauli 행렬을 곱하고 결과 행렬과 위상을 반환하는 것입니다. 입력은 숫자의 비어 있지 않은 문자열로 주어집니다 0
에 3
매트릭스 대표 로를 . 출력이 생성 된 행렬에 대해 하나의 숫자를 포함하는 문자열 임의로 선행되어야한다 , 또는 (위상을 나타 내기 위한 것이다 ).σ0
σ3
i
-
-i
-
-1
STDIN (또는 가장 가까운 대안), 명령 행 인수 또는 함수 인수를 통해 입력을 받고 STDOUT (또는 가장 가까운 대안), 함수 리턴 값 또는 함수 (out) 매개 변수를 통해 결과를 출력하는 프로그램 또는 함수를 작성할 수 있습니다.
Pauli 매트릭스와 관련된 내장 (또는 타사) 기능을 사용해서는 안됩니다.
이것은 코드 골프이며, 가장 짧은 대답 (바이트)이 이깁니다.
테스트 사례
1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1
답변
Pyth, 47 바이트
나는 이것이 여전히 골프 가능하다고 생각합니다. 그러나 CJam을 많이 능가합니다.
p.U&-=T*q3l{[0bZ)^_1%-Zb3xbZmvdz@+c"i - -i")khT
설명
결과 행렬 유형을 결정하는 것은 단순히 모든 숫자를 조정하는 것입니다.
행렬 2 개를 곱하는 동안 A*B
행렬이 아닌 행렬이 σ0
및 이면 위상이 변경됩니다 A != B
.
implicit: T=10, z=input string
mvdz evaluate each char of the input
.U reduce: b=first value, for Y in mvdz[1:]
-=T T -= ...
q3l{[0bZ) (3 == len(set([0,b,Z])))
* ^_1%-Zb3 * (-1)^((Z-b)%3)
& and
xbY update b by (b xor Y)
+c"i - -i")k the list ["i", "-", "-i", ""]
@ hT take the element at index T+1 (modulo wrapping)
p print phase and matrix
답변
파이썬 2, 108 89 87 86 바이트
x=y=0
for m in map(int,raw_input()):x+=m*y and(m-y)%3*3/2;y^=m
print"--i"[~x%4::2]+`y`
(도움을 주신 @grc와 @xnor에게 감사합니다)
설명
계수와 기본 행렬을 나누겠습니다. 우리는 기본 매트릭스에 초점을 경우에만, 우리는 (예를 들어,이 구구단을 얻을 13
것입니다 -i2
우리가 넣어, 그래서 2
) :
0123
0 0123
1 1032
2 2301
3 3210
비트 xor를 수행하는 것과 똑같은 일이 발생합니다.
이제 계수에 초점을 맞추겠습니다. 각각을 0123
표시 하면 다음과 같이 나타납니다 1,i,-1,-i
.
0123
0 0000
1 0031
2 0103
3 0310
이를 위해 먼저 m*y
왼쪽 열과 맨 위 행을 처리 하여을 수행하여 두 숫자 중 하나가 0인지 확인합니다 . (m-y)%3
그런 다음 추가하면 다음이 제공됩니다.
0123
0 0000
1 0021
2 0102
3 0210
우리가 2
대신 하는 것을 제외하고는 가깝습니다 3
. 이를 수행하여이를 설명 *3/2
합니다.
인덱싱의 경우 문자열을 가져 와서 "--i"
인덱스에서 시작하여 두 번째 문자를 모두 선택 0123
하면을 얻습니다 "-i","-","i",""
.
답변
레티 나 , 77 바이트
이 기회를 통해 새로운 Retina 기능인 다단계 루프를 선보일 것이라고 생각했습니다. 이는 많은 작업을 상당히 단축해야합니다 (특히 조건부 교체).
ii
-
+`(.)\1|0
(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0
Retina는 내 정규식 기반 프로그래밍 언어입니다. 소스 코드는 여러 단계로 그룹화 할 수 있습니다. 각 단계는 두 줄로 구성되며 첫 번째 줄에는 정규식 (및 일부 구성)이 포함되고 두 번째 줄은 대체 문자열입니다. 그런 다음 스테이지는 순서대로 STDIN에 적용되고 최종 결과는 STDOUT에 인쇄됩니다.
위의 -s
명령 줄 스위치를 사용하여 소스 파일로 직접 사용할 수 있습니다 . 그러나 각 줄을 별도의 파일에 넣을 수 있기 때문에 스위치를 계산하지 않습니다 (그런 다음 줄 바꿈은 15 바이트를 잃지 만 추가 파일에는 +15를 추가하십시오).
설명
이 솔루션의 새로운 점은 )
두 번째 단계입니다. 다단계 루프가 닫힙니다. 일치하는 것이 없습니다. (
즉, 첫 번째 단계에서 루프가 암시 적으로 시작됩니다. 따라서 처음 7 단계는 7 단계를 완전히 통과하면 결과 변경이 중지 될 때까지 반복됩니다. 이 7 단계는 단순히 문자열의 행렬 수를 점차적으로 줄이고 위상을 결합하는 다양한 변환을 수행합니다. 최종 결과에 도달하면 7 가지 패턴 중 어느 것도 더 이상 일치하지 않고 루프가 종료됩니다. 이후 결과에 숫자가 없으면 0을 추가합니다 (위 단계에서는 결과를 포함하여 모든 ID를 간단히 삭제하므로).
개별 단계는 다음과 같습니다.
ii
-
모든 쌍의 결합 i
으로 -
위상 문자를 절감 할 수 있습니다.
+`(.)\1|0
<empty>
이제 두 개의 연속 된 동일한 문자가 남아 있으면 --
동일한 행렬입니다. 두 경우 모두 곱하면 정체성이됩니다. 그러나 우리는 신원이 필요하지 않으므로 모든 신원과 명시 적 신원도 제거합니다 0
. 이 단계는 +
결과 변경이 중지 될 때까지 자체적으로 반복됩니다 . 이렇게하면 123321
다음 단계에서 모든 숫자 쌍이 고유하다고 가정 할 수있는 등의 문제가 완전히 해결됩니다.
(.)-|(\d)(\d)
-$1$3$2
이것은 실제로 하나의 골퍼 레이션을위한 두 개의 개별 변환입니다. 첫 번째 대안이 일치 $2
하고 $3
비어 있고 두 번째 대안이 일치 하면 $1
비어 있습니다. 따라서이 두 단계로 분해 할 수 있습니다.
(\d)(\d)
-$2$1
이것은 모든 숫자 쌍을 바꾸고 빼기 부호를 추가합니다. 우리는 모두 제거 이후 0
의 모든 동일한 쌍을, 이것은 단지 일치 12
, 23
, 31
, 21
, 32
, 13
. 이 단계는 이상하게 보일지 모르지만 나중에 처리 할 수없는 항목은 다음 반복에서 여기로 바뀌기 때문에 나중에이 사례의 절반 만 확인할 수 있습니다.
위 단계의 다른 부분은 다음과 같습니다.
(.)-
-$1
이것은 서서히 -
왼쪽 끝까지 표지판을 움직입니다 (반복 당 한 위치). 나는 궁극적으로 그들이 서로 옆에 있고 이전 단계에서 해결되도록 그렇게합니다.
12
i3
23
i1
31
i2
이 세 단계는 이제 단순히 세 쌍의 제품을 해결합니다. 위에서 말했듯이, 이것은 관련 사례의 절반 만 잡을 것이지만, 이전 단계가 모든 쌍을 교환 한 후 다른 절반은 다음 반복에서 처리됩니다.
)`(\d)i
i$1
이것이 루프의 마지막 단계입니다. 를 -
제외하고 왼쪽으로 이동 하는 것과 비슷합니다 i
. 가장 큰 차이점은이 i
숫자는 숫자 만 교체한다는 것 입니다. 내가 (.)i
a -i
또는 i-
2를 얻는 경우에 사용하면 무기한으로 교환되고 프로그램이 종료되지 않습니다. 따라서 이것은 -
표지판 의 오른쪽으로 만 바꿉니다 . 이것으로 충분합니다-모든 것이 -
있고 i
어느 시점에 함께 나타나면 정확하게 해결 될 수 있습니다.
^\D*$
$&0
마지막 단계 (루프 외부). 우리는 항상 모든 아이덴티티를 삭제 했으므로 결과가 실제로 아이덴티티 (시간 단계) 인 경우 출력에 필요한 숫자가 더 이상 없으므로 다시 추가합니다.
예를 들어, 모든 중간 형태 0223202330203313021301011023230323
(변경을 수행하지 않는 건너 뛰기 단계)는 다음과 같습니다.
0223202330203313021301011023230323
321321312 # Remove identities
-23-31-12-132 # Swap all pairs
-23-31-i3-132 # Resolve 12
-i1-31-i3-132 # Resolve 23
-i1-i2-i3-132 # Resolve 31
-i-1i-2i-3-312 # Move - to the left and swap pairs
-i-1i-2i-3-3i3 # Resolve 12
-i-i1-i2-3-i33 # Move i to the left
-i-i1-i2-3-i # Remove identities
--ii-1i-2-3i # Move - to the left
--ii-i1-2-i3 # Move i to the left
----i1-2-i3 # Resolve ii
i1-2-i3 # Remove identities
i-1-2i3 # Move - to the left
i-1-i23 # Move i to the left
-i-1i-32 # Move - to the left and swap pairs
-i-i1-32 # Move i to the left
--ii-1-23 # Move - to the left and swap pairs
--ii-1-i1 # Resolve 23
----1-i1 # Resolve ii
1-i1 # Remove identities
-1i1 # Move - to the left
-i11 # Move i to the left
-i # Remove identities. Now the loop can't change this any longer.
-i0 # Fix the result by adding in the 0.
답변
CJam, 58 56 바이트
나는 이것이 많이 골프를 칠 수 있다고 확신하지만 여기에 간다.
L'i'-"-i"]q{+:G$i:XA<X{GiB%_2m8%!+m<XB%gX3%3-z*}?s}*\0=o