Desafío
En esta tarea, ha calculado la cantidad de formas en que podemos distribuir las bolas A en las celdas B y cada celda tiene al menos una bola.
Las entradas A y B se dan en una sola línea separada por un espacio en blanco, las entradas son terminadas por EOF.
Es posible que desee comprobar sus soluciones aquí .
Entrada
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Salida
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Restricciones
- Cada A y B puede ser distinguible.
- 0 <= A, B <= 20
- Puedes usar cualquier idioma de tu elección
- ¡La solución más corta gana!
code-golf
math
combinatorics
Quijotesco
fuente
fuente
S(n,0)
es1
sin=0
y de0
otra manera). Si lo desea, puedo encontrar una referencia para la afirmación más fuerte de que Stirling2 está en el subgrupo asociativo del grupo exponencial de Riordan.Respuestas:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
Obviamente, cualquier lenguaje basado en matemáticas como APL me vencerá debido a la verbosidad de la sintaxis y la falta de construcciones matemáticas integradas :)
Editar Además, no tengo ninguna funcionalidad relacionada con la entrada, excepto los parámetros pasados a la función, no estoy seguro de cómo usar la entrada estándar con JavaScript ...
Editar: moverse
i--
a lam=m*
expresión; movern*=-1
enfor
; comiencer=1
a combinar las tareas y elimine las extrañas al regresar (guardar 3 caracteres)fuente
readline
yprint
. No sé lo que otros usan aquí.prompt
yalert
son el io "estándar" de JavaScript, ya que son las llamadas io de bloqueo típicas, a pesar del hecho de que nunca se suele usar io de bloqueo con JavaScript.Golfscript -
56 50 49 48 41 40 3837 caracteresNota: 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 colocarn
bolas distinguibles enk
cubos distinguibles de modo que cada cubo contenga al menos una bola, usted elige uno de losk
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 yk
como índice de columna e indexando ambos desde 0 comienzaEntonces volviendo al programa,
divide la entrada en líneas y luego para cada línea la evalúa, colocando
n
yk
en la pila, y luego llama<<STUFF>>
, que es como sigue:Esto calcula las primeras
k+1
entradas de lan+1
fila th de esa cuadrícula. Inicialmente la pila esn k
.),
da una pila den [0 1 2 ... k]
{!}%
da una pila den [1 0 0 ... 0]
donde hayk
0s.\{ <<MORE STUFF>> }*
trae eln
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;}/
fuente
[0]
->1,
, el espacio después de zip simplemente se puede eliminar, y el otro espacio se puede eliminar si solo se almacena en un operador en lugar de k. Todavía no he revisado su código, pero sospecho que podría salirse con la suya simplemente usando un valor sin ponerlo en una matriz en algunos de los lugares.J, 40
P.ej
<1 segundo para todos los casos de prueba.
Ediciones
-/
lugar de alternar(1 _1)*
(idea de JB)1x+
fuente
1x+
entonces, pero eso solo me devuelve 1 personaje, ¡mientras que tomaste 5!Lisp común (83)
Parece que debería haber una forma más corta de probar los casos base, pero no se me ocurre nada de improviso.
fuente
J, 38 a 42
Dependiendo de sus preferencias estrictas sobre los idiomas interactivos y la presentación de salida, elija entre el espectro de soluciones J:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
ejecute jconsole, ingréselo y luego pegue la entrada (termine con Cd). Notará que la salida está separada por espacios (J es un lenguaje vectorial, realiza el cálculo de toda la entrada como un todo y lo devuelve como un vector 1D, cuya presentación predeterminada está en una sola línea). Considero que está bien, el espíritu de este problema es el cálculo, no la presentación. Pero si insiste en tener nuevas líneas en su lugar:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
Reemplazar Compose (
&
) con Under (&.
) devuelve un vector de cadenas, cuya presentación termina en líneas separadas.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
ejecutar desde la línea de comandos como
$ jconsole balls.ijs < balls.in
Si votó por esto, es posible que también quiera darle algo de crédito a la solución de Eelvex .
fuente
&.
para que funcione correctamente en modo interactivo.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 caracteresGolfScript -
453836 caracteresRelación de recurrencia de implementación sucia de fuerza media (
3836 caracteres):La relación de recurrencia que robé de la solución de Peter Taylors es así:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
Con casos especiales si cualquiera de las variables es 0.
Mi implementación no reutiliza resultados anteriores, por lo que cada llamada de función se bifurca a dos llamadas nuevas, a menos que se haya alcanzado uno de los casos cero. Esto da el peor de los casos de llamadas de función 2 ^ 21-1 que toma 30 segundos en mi máquina.
Solución en serie de fuerza de luz (45 caracteres):
fuente
J, 55 caracteres
wd
). Entrada en stdin, salida en stdout.Script de prueba de Bash:
fuente
wd
?echo
, que se define como0 0&$@(1!:2&2)
. No estoy seguro de lo que eso significa, pero hace algo así como elementos bonitos de rango 1 con un salto de línea. (Ahora mismo me doy cuenta de que usa 2 en lugar de 4 ... Creo que al menos sigue siendo estándar en modo consola).<< was unexpected at this time.
siento, soy nuevo en la entrada J, siempre la usé en modo consola.Golfscript - 26 caracteres
Advertencia: el caso 12 4 necesita mucha memoria (aunque no tanto como la respuesta a continuación) y tarda bastante en ejecutarse
Obviamente esta respuesta tiene algunos problemas, pero la dejaré aquí porque los comentarios se refieren a ella y la respuesta de mellamokb se basa en ella.
Golfscript - 24 caracteres
Advertencia: el caso 12 4 necesita mucha memoria y tarda bastante en ejecutarse
fuente
0 0
debería producir1
;0 k
por cualquier otrok
debe producir0
;n 1
paran > 0
debe producir1
.Python 140 Chars
fuente
dc, 100 caracteres
Por desgracia, dc no parece estar respaldado por ideone. Puede haber un personaje o dos para exprimir, pero es hora de acostarse.
Nota: esto admite múltiples líneas de entrada, tiene la precisión suficiente para dar la salida correcta incluso para
20 19
(¡maldito seas, Perl, por el tiempo que desperdicié depurando mi solución!), Y da la salida correcta para0 0
.Las sugerencias de Nabb permiten acortar al menos hasta
a costa de dejar basura en las pilas de registros (y así quedarse sin memoria si calculamos miles de millones de respuestas).
fuente
l11
se analiza comol1 1
(puede usarloK
como un token de carácter único0
si no va a cambiar la precisión de todos modos). Puede cambiar el bucle de entrada a?[...?z1=4]
. Puede alinear la macro en el registro1
. Y probablemente puedas guardar muchos más personajes en general, pero esperaré a que sea más corto para comprenderlo.Golfscript (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Modificación a
gnibbler
la solución GolfScript. Creo que esta es una solución que funciona, probada con [3,2], [4,2], [6,3] y [9,2] con las respuestas correctas. (Utilicé$
y@
para variables para ajustar el espacio alrededor de labase
palabra clave).Hay dos problemas con
gnibbler
la solución actual.Editar
~:@\?:$,{$+}%{@base(;@,\-,0=},,
¡Mejor solución todavía! No es necesario incrementar, solo agregue a todos los números para que comiencen con [1], y no faltarán dígitos (incluido el relleno izquierdo de 0) una vez que descontamine ese primer dígito. Esta solución debería funcionar y se ha probado con las mismas entradas anteriores. También es mucho más rápido porque no estamos incrementando antes de tomar exponente para generar la matriz (pero aún sufre el mismo problema de rendimiento / memoria para entradas más grandes).
Editar : Use
gnibbler
la idea de mover la adición del$
interior del filtro en lugar de como un paso adicional. (guardar 3 caracteres)fuente
0 0
.n 1
por cualquier n, hace que se cuelgue. hmm ..05AB1E , 19 bytes
NOTA: Es extremadamente lento y ya agota el tiempo de espera
12 4
. Sin embargo, está funcionando según lo previsto.Veré si puedo encontrar un método alternativo que funcione para todos los casos de prueba en un tiempo razonable.Vea a continuación una versión mucho más rápida que ejecuta todos los casos de prueba en menos de un segundo.Pruébelo en línea o verifique algunos casos de prueba más (de los más pequeños) .
Explicación:
05AB1E , 29 bytes
Aquí una versión mucho más rápida que funciona para todos los casos de prueba en aproximadamente 0.5 segundos en TIO:
La respuesta de JavaScript del puerto de @mellamokb , ¡así que asegúrese de votarlo!
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
NOTA: Funciona para el caso de borde
0 0
en este caso (a diferencia de la respuesta de JavaScript de la que porté este método), porque elL
incorporado creará una lista[0,1]
.fuente