Dado um m
por n
barra de chocolate, m,n
positivo, produza o número de maneiras de quebrar a barra em mn
pedaços 1 por 1, onde cada quebra ocorre em uma linha de grade.
A ordem é importante. As peças também são distinguíveis; portanto, as duas peças em uma das extremidades de uma barra de chocolate 1 por 3 não são equivalentes.
Por exemplo, para um bloco 2 por 2, temos:
_ _ _ _ _ _ _ _
|_‖_| -> |‗| |_| -> |_| |‗| -> |_| |_|
|_‖_| |_| |_| _ |_| _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|_‖_| -> |_| |‗| -> |‗| |_| -> |_| |_|
|_‖_| |_| |_| |_| _ _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_‖_| -> |_| |_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_|_| |_‖_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_|_| -> |_‖_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_‖_| |_| |_| |_| |_|
Portanto, existem 4 maneiras de dividir uma barra de chocolate 2 por 2.
Regras
A entrada será dois números inteiros via entrada de função, STDIN, linha de comando ou similar. Saída um único número, o número de maneiras de quebrar a barra de chocolate.
Como os números aumentam rapidamente, não se preocupe se a saída exceder os limites inteiros do seu idioma - seu envio será válido enquanto o algoritmo funcionar teoricamente para todas as entradas possíveis.
Casos de teste
A saída não depende da ordem de m,n
, portanto, os casos de teste são listados de tal forma 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 são os números de chocolate dispostos em um triângulo, de modo que cada linha corresponda à soma m+n
.
fonte
options(expressions=...)
e argumento--max-ppsize=
) resultaria em um código mais longo que este.f=
.Python 2, 135 bytes
Aqui está o que eu criei. É muito lento, mas aqui está uma versão mais rápida (precisa de repoze.lru ):
Exemplos
Explicação
O código define uma função
C
que utiliza uma matriz de partes. O algoritmo é assim:for i,Q in enumerate(A)
: percorre o conjunto de peças.for W,H in(Q,Q[::-1])
: calcule as formas duas vezes, girando 90 graus.for c in range(1,W)
: percorre as posições possíveis para dividir.A[:i]+A[i+1:]+[(c,H),(W-c,H)]
: obtenha uma lista sem a peça dividida e com as duas novas peças.C(…)
: chame a função novamente nessa lista.sum(…)
: soma os resultados para cada divisão possível.or 1
: se nenhuma divisão for possível, existe exatamente uma maneira de dividir o chocolate.Finalmente, o código é chamado com uma matriz que contém a entrada.
fonte
ES6, 141 bytes
Com base na fórmula encontrada por @CameronAavik. Ungolfed:
fonte