Dada una m
por n
barra de chocolate, m,n
positiva, la salida el número de formas de romper la barra en mn
1 por 1 piezas donde cada pausa se produce en una línea de cuadrícula.
El orden es importante. Las piezas también son distinguibles, por lo que las dos piezas en cada extremo de una barra de chocolate de 1 por 3 no son equivalentes.
Por ejemplo, para un bloque de 2 por 2 tenemos:
_ _ _ _ _ _ _ _
|_‖_| -> |‗| |_| -> |_| |‗| -> |_| |_|
|_‖_| |_| |_| _ |_| _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|_‖_| -> |_| |‗| -> |‗| |_| -> |_| |_|
|_‖_| |_| |_| |_| _ _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_‖_| -> |_| |_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_|_| |_‖_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_|_| -> |_‖_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_‖_| |_| |_| |_| |_|
Por lo tanto, hay 4 formas de dividir una barra de chocolate de 2 por 2.
Reglas
La entrada será dos enteros a través de la entrada de función, STDIN, línea de comando o similar. Salida de un solo número, el número de formas de romper la barra de chocolate.
Dado que los números aumentan bastante rápido, no se preocupe si la salida excede los límites enteros de su idioma; su envío será válido siempre que el algoritmo funcione teóricamente para todas las entradas posibles.
Casos de prueba
El resultado no depende del orden de m,n
, por lo que los casos de prueba se enumeran de manera tal m <= n
.
1 1 -> 1
1 2 -> 1
1 3 -> 2
1 4 -> 6
1 5 -> 24
1 10 -> 362880
2 2 -> 4
2 3 -> 56
2 4 -> 1712
2 5 -> 92800
2 10 -> 11106033743298560
3 3 -> 9408
3 4 -> 4948992
3 5 -> 6085088256
3 10 -> 76209753666310470268511846400
4 4 -> 63352393728
A261964 son los números de chocolate dispuestos en un triángulo de tal manera que cada fila corresponde a la suma m+n
.
fuente
options(expressions=...)
y argumento--max-ppsize=
) daría como resultado un código más largo que este.f=
.Python 2, 135 bytes
Esto es lo que se me ocurrió. Es realmente lento, pero aquí hay una versión más rápida (necesita repoze.lru ):
Ejemplos
Explicación
El código define una función
C
que toma una matriz de piezas. El algoritmo es como tal:for i,Q in enumerate(A)
: recorre el conjunto de piezas.for W,H in(Q,Q[::-1])
: calcular formas dos veces, girando 90 grados.for c in range(1,W)
: recorre las posibles posiciones para dividir.A[:i]+A[i+1:]+[(c,H),(W-c,H)]
: obtenga una lista sin la pieza dividida y con las dos piezas nuevas.C(…)
: llama a la función nuevamente en esa lista.sum(…)
: suma los resultados para cada posible división.or 1
: si no hay divisiones posibles, hay exactamente una forma de dividir el chocolate.Finalmente, el código se llama con una matriz que contiene la entrada.
fuente
ES6, 141 bytes
Basado en la fórmula encontrada por @CameronAavik. Sin golf:
fuente