미로 , 42 바이트
_8
,%
;
"}{{+_5
"= %_!
= """{
;"{" )!
0으로 나누기 오류 (STDERR의 오류 메시지)로 종료됩니다.
온라인으로 사용해보십시오!
레이아웃은 실제로 비효율적으로 느껴지지만 지금은 골프를 치는 방법을 보지 못하고 있습니다.
설명
이 솔루션은 Dennis의 산술 기법을 기반으로합니다. 모든 문자 코드를 modulo 취하고 8
양쪽 끝에서 쌍을 추가하고로 나눌 수 있는지 확인하십시오 5
.
미로 프라이머 :
- Labyrinth에는 main 과 aux (iliary) 라는 두 개의 임의 정밀도 정수 스택 이 있으며 처음에는 (암시 적) 무한한 양의 0으로 채워집니다.
- 소스 코드는 미로와 유사하며, 명령 포인터 (IP)는 가능할 때 (모퉁이를 돌 때) 복도를 따라갑니다. 코드는 첫 번째 유효한 문자에서 읽기 순서로 시작합니다 (예 :이 경우 왼쪽 상단). IP가 어떤 형태의 접합 (즉, 여러 개의 인접 셀에서 나온 것)에 도달하면 메인 스택의 상단을 기준으로 방향을 선택합니다. 기본 규칙은 다음과 같습니다. 음수이면 왼쪽으로 돌리고 0이면 계속 진행하고 양수이면 오른쪽으로 돌리십시오. 벽이있어이 중 하나를 사용할 수없는 경우 IP는 반대 방향으로 진행됩니다. 데드 엔드를 칠 때 IP도 돌아갑니다.
- 숫자는 메인 스택의 상단에 10을 곱한 다음 숫자를 추가하여 처리됩니다.
이 코드는 작은 2x2의 시계 방향 루프로 시작하며 모든 입력 모듈로 8을 읽습니다.
_ Push a 0.
8 Turn into 8.
% Modulo. The last three commands do nothing on the first iteration
and will take the last character code modulo 8 on further iterations.
, Read a character from STDIN or -1 at EOF. At EOF we will leave loop.
이제 ;
삭제합니다 -1
. 메인 스택의 상단 (즉, 마지막 문자)을 맨 아래로 이동시키는 또 다른 시계 방향 루프를 입력합니다.
" No-op, does nothing.
} Move top of the stack over to aux. If it was at the bottom of the stack
this will expose a zero underneath and we leave the loop.
= Swap top of main with top of aux. The effect of the last two commands
together is to move the second-to-top stack element from main to aux.
" No-op.
이제 짧은 선형 비트가 있습니다.
{{ Pull two characters from aux to main, i.e. the first and last (remaining)
characters of the input (mod 8).
+ Add them.
_5 Push 5.
% Modulo.
IP는 이제 5로 나누기를 테스트하기위한 분기점 역할을하는 접합점에 있습니다. 모듈로 결과가 0이 아닌 경우 입력이 Watson-Crick 회문이 아니고 동쪽으로 바뀝니다.
_ Push 0.
! Print it. The IP hits a dead end and turns around.
_ Push 0.
% Try to take modulo, but division by zero fails and the program terminates.
그렇지 않으면 나머지 입력을 계속 확인해야하므로 IP가 계속 남쪽으로 이동합니다. {
나머지 입력 하단 통해 당긴다. 입력을 다 써 버린 경우 0
( aux 의 맨 아래부터 ) IP가 남쪽으로 계속 이동합니다.
) Increment 0 to 1.
! Print it. The IP hits a dead end and turns around.
) Increment 0 to 1.
{ Pull a zero over from aux, IP keeps moving north.
% Try to take modulo, but division by zero fails and the program terminates.
그렇지 않으면 문자열에 검사 할 문자가 더 있습니다. IP는 서쪽으로 바뀌고 다음 (시계 방향) 2x2 루프로 이동합니다.
" No-op.
" No-op.
{ Pull one value over from aux. If it's the bottom of aux, this will be
zero and the IP will leave the loop eastward.
" No-op.
이 루프가 끝나면 첫 번째와 마지막 문자를 제외하고 맨 위에 0을 제외하고 기본 스택에서 입력을 다시 얻습니다. ;
폐기는 0
다음 =
스택의 꼭대기를 교환합니다, 그러나 이것은 단지 첫 번째 취소하는 것입니다 =
우리가 지금 다른 위치에 루프를 입력하고 있기 때문에, 루프있다. 헹구고 반복하십시오.