전주곡 , 69 55 54 바이트
?1-(v #1)-
1 0v ^(# 0 (1+0)#)!
(#) ^#1-(0)#
표준 호환 인터프리터가 사용되면 입력 및 출력을 바이트 값으로 사용합니다 . 실제로 STDIN / STDOUT에서 십진수를 사용하려면 Python 인터프리터 와 NUMERIC_OUTPUT = True
추가 옵션이 필요 합니다NUMERIC_INPUT = True
.
설명
프로그램의 골격은
?1-( 1 -
1 )!
우리 N
는 첫 번째 음성으로 입력 을 읽고 그것을 얻기 위해 감소시킵니다 N-1
. 또한 두 번째 음성을로 초기화합니다 1
. 그런 다음 N-1
각 반복이 두 번째 스택에서 시퀀스의 다음 값을 가져옵니다. 마지막으로 우리는 N
th 숫자를 인쇄합니다 .
프로그램의 아이디어는 시퀀스의 각 요소를 세 번째 음성의 대기열에 넣고 각 반복에서 해당 대기열의 헤드를 줄이는 것입니다. 헤드가 도달 0
하면 시퀀스 값을 증가시키고 제거합니다 0
.
이제 문제는 Prelude가 대기열이 아닌 스택을 사용한다는 것입니다. 따라서 대기열처럼 사용하려면 해당 스택을 약간 이동해야합니다.
v #
0v ^
(#)
이렇게하면 시퀀스의 현재 값이 첫 번째 음성 (임시 사본으로)에 복사 0
되고 두 번째 음성으로 푸시됩니다 (대기열의 끝 표시). 그런 다음 루프를 수행하여 세 번째 스택을 두 번째 스택으로 이동 (및 반대로)합니다. 루프 후, 현재 시퀀스 값의 사본을 두 번째 스택 (큐의 꼬리) 위에 놓습니다.
)
(#
^#1-
이것은 약간 추한 것처럼 보이지만 본질적으로 스택을 세 번째 음성으로 다시 이동시키는 루프입니다. )
가 쉬프팅 명령과 동일한 열에 있기 때문에, 0
두 번째 음성을 더 일찍 붙인 것은 세 번째 음성을 끝내게되므로 다른 음성으로 제거해야합니다 #
. 그런 다음 세 번째 음색의 맨 위, 즉 큐의 헤드를 줄입니다.
이제 약간 성가시다-그 값이 0
인 경우 코드를 실행하고 싶지만 Prelude의 유일한 제어 구조 (루프)는 0이 아닌 값에만 응답합니다.
0 (1+0)#
(0)#
두 번째 음성의 상단은 진실합니다 (골롬 시퀀스에 0
s가 포함되어 있지 않기 때문에 ). 따라서 작업량은 그 음성 (후자의 괄호 쌍)으로 들어갑니다. 우리 는 대기열의 머리가 아직 없다면 그것을 막을 필요가 0
있습니다. 먼저 0
큐의 헤드가 여전히 0이 아닌 경우 세 번째 음색에 "루프"가있어 두 번째 음색으로 A를 푸시 합니다. 또한 0
루프를 즉시 종료하기 위해 세 번째 음색을 사용합니다. #
제 보이스는 그 중 하나를 제거하는 0
경우, 또는 큐의 선두 즉 이미 제로였다. 이제 두 번째 루프는 대기열의 헤드가 0 인 경우에만 입력됩니다.0
두 번째 목소리는 결코 밀리지 않았습니다). 이 경우 시퀀스의 현재 값을 증가시키고 a 0
를 눌러 루프를 종료합니다. 마지막으로 항상 0
스택 맨 위에 있어야하므로 버려야합니다.
나는 Prelude에서 논리적 부정이 성가신 것이라고 말했다.
n
보다는2 - n % 1
. 답변이 크게 다를 것으로 예상 할만한 이유가 있습니까?