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 n
ayırt edilebilir toplar yerleştirmek için, ilk top ( ) k
için k
kovalardan 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 n
satır endeks olarak ve k
sü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 n
ve k
yığı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+1
giriş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 k
0s.
\{ <<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 j
ve 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, n
tablonun 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;}/