Cubix, 33 32 바이트
u*.$s.!(.01I^<W%NW!;<,;;q+p@Opus
순수한 형태 :
u * .
$ s .
! ( .
0 1 I ^ < W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
온라인으로 사용해보십시오!
노트
- 최대 170 개의 입력과 함께 작동하며 더 높은 입력은 계승이
Infinity
수 (기술적으로 말하자면, 쓰기 불가능하고 열거 불가능하고 구성 불가능한 윈도우 객체의 속성)를 산출하기 때문에 무한 루프 를 발생시킵니다.
- 2 53 보다 큰 숫자 (= 9 007 199 254 740 992)는 JavaScript에 정확하게 저장할 수 없으므로 입력 19 이상에서는 정확도가 손실됩니다 .
설명
이 프로그램은 두 개의 루프로 구성됩니다. 첫 번째는 입력의 계승을 계산하고 다른 하나는 결과를 숫자로 나누고 함께 더합니다. 그런 다음 합계가 인쇄되고 프로그램이 완료됩니다.
스타트
먼저 스택을 준비해야합니다. 이 부분에서는 처음 세 가지 지침을 사용합니다. IP는 네 번째 줄에서 시작하여 동쪽을 가리 킵니다. 스택이 비어 있습니다.
. . .
. . .
. . .
0 1 I . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
우리는 스택 맨 아래에 합계를 유지하므로 스택 맨 아래에 0
합계를 저장하여 합계가되어야합니다. 1
입력은 초기에 숫자를 곱하기 때문에 a를 눌러야 합니다. 이것이 0이면 계승은 항상 0도 산출합니다. 마지막으로 입력을 정수로 읽습니다.
이제 스택이 [0, 1, input]
있고 IP가 네 번째 줄, 네 번째 열에 있으며 동쪽을 가리 킵니다.
계승 루프
이것은 스택의 상위 2 개 요소 (이전 루프와 입력-n의 결과를 곱한 다음 입력을 줄입니다)의 간단한 루프입니다. 입력이 0에 도달하면 중단됩니다. $
명령으로 인해 IP가 u
- 루프는 큐브의 다음 부분이며 IP는 네 번째 줄, 네 번째 열에서 시작합니다.
u * .
$ s .
! ( .
. . . ^ < . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . .
. . .
. . .
때문에의 ^
문자의 IP 즉시 북쪽으로 이동을 시작합니다. 그런 다음 u
IP를 돌리고 오른쪽으로 이동합니다. 맨 아래에는 또 다른 화살표가 있습니다. <
IP가 다시를 가리 킵니다 ^
. 스택은로 시작하며 [previousresult, input-n]
여기서 n
반복 횟수는입니다. 루프에서 다음 문자가 실행됩니다.
*s(
* # Multiply the top two items
# Stack: [previousresult, input-n, newresult]
s # Swap the top two items
# Stack: [previousresult, newresult, input-n]
( # Decrement the top item
# Stack: [previousresult, newresult, input-n-1]
그런 다음 스택의 상단 (감소 된 입력)을 명령 에 0
의해 확인하고이 값 !
이 0
인 경우 u
문자를 건너 뜁니다.
숫자 합
IP는 입방체를 감싸며 네 번째 줄의 마지막 문자로 끝나고 처음에는 서쪽을 가리 킵니다. 다음 루프는 거의 모든 나머지 문자로 구성됩니다.
. . .
. . .
. . .
. . . . . W % N W ! ; <
, ; ; q + p @ O p u s .
. . . . . . . . . . . .
. . .
. . .
. . .
루프는 먼저 스택에서 최상위 항목 ( 10
또는 0
)을 삭제 한 다음 계승 결과의 남은 항목을 확인합니다. 이 값이로 줄어들 0
면 스택 맨 아래 (합)가 인쇄되고 프로그램이 중지됩니다. 그렇지 않으면 다음 명령어가 실행됩니다 (스택이로 시작됨 [oldsum, ..., factorial]
).
N%p+q;;,s;
N # Push 10
# Stack: [oldsum, ..., factorial, 10]
% # Push factorial % 10
# Stack: [oldsum, ..., factorial, 10, factorial % 10]
p # Take the sum to the top
# Stack: [..., factorial, 10, factorial % 10, oldsum]
+ # Add top items together
# Stack: [..., factorial, 10, factorial % 10, oldsum, newsum]
q # Send that to the bottom
# Stack: [newsum, ..., factorial, 10, factorial % 10, oldsum]
;; # Delete top two items
# Stack: [newsum, ..., factorial, 10]
, # Integer divide top two items
# Stack: [newsum, ..., factorial, 10, factorial/10]
s; # Delete the second item
# Stack: [newsum, ..., factorial, factorial/10]
그리고 factorial/10
0이 될 때까지 루프가 다시 시작됩니다 .
n>21