Golfscript - 56 50 49 48 41 40 38 37 caracteres
n%{~),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;}/
Nota: esto maneja múltiples líneas de entrada, es rápido (1/8 segundos para hacer los casos de prueba) y no interrumpe ninguna entrada legal.
(La primera versión también fue mi primer programa Golfscript; gracias a eBusiness por señalar varios trucos que me perdí).
Para hacer de esto una publicación educativa útil también, aquí hay una explicación de cómo funciona. Comenzamos con la recurrencia f(n, k) = k * (f(n-1, k) + f(n-1, k-1)). Esto puede entenderse combinatoriamente como decir que para colocar nbolas distinguibles en kcubos distinguibles de modo que cada cubo contenga al menos una bola, usted elige uno de los kcubos para la primera bola ( k *) y luego contendrá al menos una bola más ( f(n-1, k)) o no lo hará ( f(n-1, k-1)).
Los valores resultantes de esto forman una cuadrícula; tomando ncomo índice de fila y kcomo índice de columna e indexando ambos desde 0 comienza
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 ...
. . . . . . . .
. . . . . . . .
. . . . . . . .
Entonces volviendo al programa,
n%{~ <<STUFF>> }/
divide la entrada en líneas y luego para cada línea la evalúa, colocando ny ken la pila, y luego llama <<STUFF>>, que es como sigue:
),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;
Esto calcula las primeras k+1entradas de la n+1fila th de esa cuadrícula. Inicialmente la pila es n k.
),da una pila de n [0 1 2 ... k]
{!}%da una pila de n [1 0 0 ... 0]donde hay k0s.
\{ <<MORE STUFF>> }*trae el na la cima y lo convierte en el número de veces que ejecutamos <<MORE STUFF>>.
Nuestra pila actualmente es una fila de la tabla: [f(i,0) f(i,1) ... f(i,k)]
0.@pone un par de ceros antes de esa matriz. El primero será jy el segundo será f(i,j-1).
{ <<FINAL LOOP>> }/recorre los elementos de la matriz; para cada uno lo coloca en la parte superior de la pila y luego ejecuta el cuerpo del bucle.
.@+2$*@)@es aburrida la manipulación de la pila para tomar ... j f(i,j-1) f(i,j)y ceder ... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]pops de los sobrantesk+1 f(i,k)y reúne todo en una matriz, listo para la próxima ronda del ciclo.
Finalmente, cuando generamos la nfila th de la tabla,
)p;toma el último elemento, lo imprime y descarta el resto de la fila.
Para la posteridad, tres soluciones de 38 caracteres sobre este principio:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/