레티 나 , 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.