Compte tenu d' une m
par n
barre de chocolat, m,n
sortie positive, le nombre de moyens de briser la barre dans mn
une par une des pièces , où chaque rupture se produit sur une ligne de grille.
L'ordre est important. Les morceaux se distinguent également, de sorte que les deux morceaux à chaque extrémité d'une barre de chocolat 1 par 3 ne sont pas équivalents.
Par exemple, pour un bloc 2 par 2, nous avons:
_ _ _ _ _ _ _ _
|_‖_| -> |‗| |_| -> |_| |‗| -> |_| |_|
|_‖_| |_| |_| _ |_| _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|_‖_| -> |_| |‗| -> |‗| |_| -> |_| |_|
|_‖_| |_| |_| |_| _ _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_‖_| -> |_| |_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_|_| |_‖_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_|_| -> |_‖_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_‖_| |_| |_| |_| |_|
Il existe donc 4 façons de briser une barre de chocolat 2 par 2.
Règles
L'entrée sera deux entiers via l'entrée de fonction, STDIN, la ligne de commande ou similaire. Sortie d'un seul numéro, le nombre de façons de briser la barre de chocolat.
Étant donné que les nombres augmentent assez rapidement, ne vous inquiétez pas si la sortie dépasse les limites entières de votre langue - votre soumission sera valide tant que l'algorithme fonctionnera théoriquement pour toutes les entrées possibles.
Cas de test
La sortie ne dépend pas de l'ordre de m,n
, donc les cas de test sont répertoriés de cette façon 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 est les nombres de chocolat disposés dans un triangle de telle sorte que chaque rangée correspond à la somme m+n
.
la source
options(expressions=...)
et en argument--max-ppsize=
) entraînerait un code plus long que celui-ci.f=
.Python 2, 135 octets
Voici ce que j'ai trouvé. C'est vraiment lent, mais voici une version plus rapide (nécessite repoze.lru ):
Exemples
Explication
Le code définit une fonction
C
qui prend un tableau de pièces. L'algorithme est en tant que tel:for i,Q in enumerate(A)
: boucle à travers le tableau de pièces.for W,H in(Q,Q[::-1])
: calculez deux fois le chemin en tournant de 90 degrés.for c in range(1,W)
: boucle à travers les positions possibles pour se diviser.A[:i]+A[i+1:]+[(c,H),(W-c,H)]
: obtenir une liste sans le morceau fendu et avec les deux nouveaux morceaux.C(…)
: appelez à nouveau la fonction sur cette liste.sum(…)
: additionne les résultats pour chaque division possible.or 1
: si aucune division n'est possible, il y a exactement une façon de diviser le chocolat.Enfin, le code est appelé avec un tableau contenant l'entrée.
la source
ES6, 141 octets
Basé sur la formule trouvée par @CameronAavik. Non golfé:
la source