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 n
bolas distinguibles en k
cubos distinguibles de modo que cada cubo contenga al menos una bola, usted elige uno de los k
cubos 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 n
como índice de fila y k
como í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 n
y k
en la pila, y luego llama <<STUFF>>
, que es como sigue:
),{!}%\{0.@{.@+2$*@)@}/;;]}*)p;
Esto calcula las primeras k+1
entradas de la n+1
fila 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 k
0s.
\{ <<MORE STUFF>> }*
trae el n
a 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á j
y 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 n
fila 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;}/