골프 스크립트 -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;}/