Cubix, 24 19 바이트
)uO)ABq-!wpUp)W.@;;
노트
- 실제로 입력의 끝에 같은 문자가 몇 개 있는지 계산하므로 실제로 큰 정수와 긴 문자열에서도 작동합니다 (끝에 동일한 문자의 수가 JavaScript의 최대 정밀도보다 작은 한) 10 진수 기준 약 15 자리).
- 입력이 입력 필드에 들어가고 출력이 출력 필드에 인쇄됩니다
여기 사용해보십시오
설명
먼저 큐브를 확장 해 봅시다
) u
O )
A B q - ! w p U
p ) W . @ ; ; .
. .
. .
실행 단계는 세 단계로 나눌 수 있습니다.
- 입력 분석
- 문자 비교
- 인쇄 결과
1 단계 : 입력
실행되는 처음 두 문자는 A
및 B
입니다. A
모든 입력을 읽고 스택에 문자 코드로 푸시합니다. 이 작업은 반대로 수행되며 첫 번째 문자는 스택 맨 위에 있고 마지막 문자는 거의 맨 아래에 있습니다. 맨 아래에 -1
( EOF
)가 표시되며, 문자열 끝에 연속 문자 수에 대한 카운터로 사용됩니다. 마지막 두 문자를 포함하려면 스택의 상단이 필요하므로 루프에 들어가기 전에 스택을 뒤집습니다. 스택의 상단 부분은 이제 다음과 같습니다 ..., C[n-1], C[n], -1
.
큐브의 IP 위치는 현재 위치 E
이며 오른쪽을 가리 킵니다. 아직 실행되지 않은 모든 명령은 no-ops (완전 중지)로 대체되었습니다.
. .
. .
A B E . . . . .
. . . . . . . .
. .
. .
2 단계 : 문자 비교
스택은입니다 ..., C[a-1], C[a], counter
. 여기서 counter
확인할 두 문자 ( C[a]
및 C[a-1]
)가 같을 때 증가하는 카운터 입니다. IP는 먼저 S
캐릭터 에서이 루프에 들어가 오른쪽으로 이동합니다. E
문자는 IP (오른쪽을 가리키는) 끝날 때 위치 인 C[a]
과 C[a-1]
같은 값을 감산하는 것을 의미하지 않는다 C[a]
에서 것은 C[a-1]
수득되지 않는을 0
, 이는 케이스가 다음 명령에서 !
스킵 될 것이다 (A이다 w
).
. .
. .
. S q - ! w E .
p ) W . . ; ; .
. .
. .
전체 루프 중에 실행되는 명령은 다음과 같습니다.
q-!;;p) # Explanation
q # Push counter to the bottom of the stack
# Stack (counter, ..., C[a-1], C[a])
- # Subtract C[a] from C[a-1], which is 0 if both are equal
# Stack (counter, ..., C[a-1], C[a], C[a-1]-C[a])
! # Leave the loop if C[a-1]-C[a] does not equal 0
;; # Remove result of subtraction and C[a] from stack
# Stack (counter, ..., C[a-1])
p # Move the bottom of the stack to the top
# Stack (..., C[a-1], counter)
) # Increment the counter
# Stack (..., C[a-1], counter + 1)
그런 다음 반복됩니다.
3 단계 : 인쇄 결과
루프를 일찍 떠났으므로 스택은 다음과 같습니다 counter, ..., C[a-1]-C[a]
. 카운터를 인쇄하는 것은 쉽지만 루프의 마지막 반복에서 카운터를 수행하지 않았기 때문에 카운터를 한 번 증가시켜야하고에서 -1
대신 카운트를 시작했기 때문에 카운터를 한 번 더 증가시켜야합니다 0
. 큐브의 경로는 다음에서 시작하여 S
오른쪽을 가리 킵니다. IP에 의해 실행되는 두 개의 no-ops는 IP 방향을 가리키는 화살표로 대체됩니다.
) u
O )
. B . . . S p U
. ) . . @ . . .
> >
. .
명령은 다음 순서로 실행됩니다. 있습니다 B)
우리가 그것을 종료하려고하기 때문에 최종 변경 스택에서 지침이 있지만, 프로그램에 영향을 미치지 않습니다, 우리는 더 이상 스택을 사용하지 마십시오.
p))OB)@ # Explanation
p # Pull the counter to the top
# Stack: (..., counter)
)) # Add two
# Stack: (..., counter + 2)
O # Output as number
B) # Reverse the stack and increment the top
@ # End the program
Alea iacta est.