Golfscript - 56 50 49 48 41 40 38 37 karakter
n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/
Not: Bu, birden çok girdi satırını işler, hızlıdır (test senaryolarını yapmak için 1/8 sn) ve herhangi bir yasal girdi için kesilmez.
(İlk sürüm aynı zamanda ilk Golfscript programımdı; kaçırdığım birkaç numaraya işaret ettiği için eBusiness sayesinde).
Bunu da faydalı bir eğitim postası yapmak için, nasıl çalıştığının bir açıklaması. Tekrar ile başlıyoruz f(n, k) = k * (f(n-1, k) + f(n-1, k-1)). Bu, kombine olarak , her bir kova en az bir top içerecek şekilde nayırt edilebilir toplar yerleştirmek için, ilk top ( ) kiçin kkovalardan k *birini seçip ardından en az bir top ( f(n-1, k)) içereceğini söyleyerek anlaşılabilir. yoksa olmaz ( f(n-1, k-1)).
Bundan kaynaklanan değerler bir ızgara oluşturur; alarak nsatır endeks olarak ve ksütun indeksi olarak ve 0'dan hem indeksleme başlatıldığında
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 ...
. . . . . . . .
. . . . . . . .
. . . . . . . .
Yani programa dönersek,
n%{~ <<STUFF>> }/
girdiyi satırlara böler ve her satır için yığını değerlendirir nve kyığına koyar ve sonra <<STUFF>>aşağıdaki gibi çağrı yapar :
),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;
Bu , söz konusu ızgaranın th satırının ilk k+1girişlerini hesaplar n+1. Başlangıçta yığın n k.
),verir yığın bölgesinin n [0 1 2 ... k]
{!}%yığınını verir n [1 0 0 ... 0]olduğu yerde k0s.
\{ <<MORE STUFF>> }*getiren nüstüne ve ona biz yürütme sayısını yapar <<MORE STUFF>>.
Yığımız şu anda tablonun [f(i,0) f(i,1) ... f(i,k)]
0.@bir satırıdır: bu diziden önce birkaç 0 koyar. Birincisi olacak jve ikincisi olacak f(i,j-1).
{ <<FINAL LOOP>> }/dizinin elemanları arasında dolaşır; her biri için yığının üstüne koyar ve sonra döngü gövdesini yürütür.
.@+2$*@)@almak ... j f(i,j-1) f(i,j)ve vermek için sıkıcı yığın manipülasyonu ... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]soldan çıkark+1 f(i,k)ve her şeyi bir dizi halinde toplar, bir sonraki döngü için hazır.
Son olarak, ntablonun th satırını oluşturduğumuzda
)p;, son öğeyi alır, yazdırır ve satırın geri kalanını atar.
Gelecek nesiller için bu prensipte üç 38 karakterlik çözüm:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/