골프 스크립트 -56 50 49 48 41 40 38 37 자
n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/
참고 : 이것은 여러 줄의 입력을 처리하고 빠르며 (테스트 케이스를 수행하는 데 1/8 초) 법적 입력을 위반하지 않습니다.
(첫 번째 버전은 나의 최초의 Golfscript 프로그램이기도했습니다. 제가 놓친 몇 가지 트릭을 지적한 eBusiness 덕분에).
이 글을 유용한 교육용 게시물로 만들기 위해 어떻게 작동하는지에 대한 설명이 있습니다. 우리는 재발로 시작합니다 f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. 이것은 배치하는 것을 말 combinatorically 이해 될 수 n
에서 구별 공을 k
각 버킷은 적어도 하나 개의 공을 포함하도록 구별 버킷, 당신이 중 하나를 선택 k
처음 볼 (버킷을 k *
() 다음 중 하나가 적어도 한 번 더 공을 포함합니다 f(n-1, k)
) 또는 ( f(n-1, k-1)
) 이 아닙니다 .
이 결과 값은 격자를 형성합니다. 복용 n
행 인덱스로 및 k
컬럼 인덱스로 0 내지 모두를 인덱싱 그것은 시작
1 0 0 0 0 0 0 ...
0 1 0 0 0 0 0 ...
0 1 2 0 0 0 0 ...
0 1 6 6 0 0 0 ...
0 1 14 36 24 0 0 ...
0 1 30 150 240 120 0 ...
0 1 62 540 1560 1800 720 ...
. . . . . . . .
. . . . . . . .
. . . . . . . .
프로그램으로 돌아가서
n%{~ <<STUFF>> }/
라인으로 입력을 분할 한 후, 각 라인에 대해 평가하여, 퍼팅 n
및 k
스택 다음 호출 <<STUFF>>
은 다음과 같이 인 :
),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;
그러면 해당 그리드 k+1
의 세 n+1
번째 행의 첫 번째 항목 이 계산 됩니다. 처음에 스택은 n k
입니다.
),
스택 은 0 n [0 1 2 ... k]
{!}%
이 n [1 0 0 ... 0]
있는 곳에 스택을 제공합니다 k
. 를 맨 위로
\{ <<MORE STUFF>> }*
가져오고 n
실행 횟수를 지정 <<MORE STUFF>>
합니다.
우리의 스택은 현재 테이블의 행입니다 [f(i,0) f(i,1) ... f(i,k)]
0.@
. 해당 배열 앞에 몇 개의 0을 넣습니다. 첫 번째는 j
이고 두 번째는입니다 f(i,j-1)
.
{ <<FINAL LOOP>> }/
배열의 요소를 반복합니다. 각각에 대해 스택 위에 놓은 다음 루프 본문을 실행합니다.
.@+2$*@)@
취할 스택 조작을 지루 ... j f(i,j-1) f(i,j)
및 수율 ... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
떨어져 팝 왼쪽 오버k+1 f(i,k)
모든 것을 배열로 모아서 다음 순환을 준비합니다.
마지막으로, n
테이블 의 세 번째 행을 생성하면
)p;
마지막 요소를 가져 와서 인쇄하고 나머지 행을 버립니다.
후손을 위해이 원칙에 대한 세 가지 38 문자 솔루션 :
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/