Bei einer gegebene m
von n
Schokoriegel, m,n
positive, Ausgabe der Anzahl der Möglichkeiten , die Bar , in die Pause mn
1 von 1 Stück , wo jede Pause auf einem Gitternetz auftritt.
Ordnung ist wichtig. Die Stücke sind auch unterscheidbar, so dass die beiden Stücke an beiden Enden einer 1 x 3-Schokoladentafel nicht gleichwertig sind.
Zum Beispiel haben wir für einen 2 mal 2 Block:
_ _ _ _ _ _ _ _
|_‖_| -> |‗| |_| -> |_| |‗| -> |_| |_|
|_‖_| |_| |_| _ |_| _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|_‖_| -> |_| |‗| -> |‗| |_| -> |_| |_|
|_‖_| |_| |_| |_| _ _ _
|_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_‖_| -> |_| |_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_|_| |_‖_| |_| |_|
_ _ _ _ _ _ _ _
|‗|‗| -> |_|_| -> |_‖_| -> |_| |_|
|_|_| _ _ _ _ _ _
|_‖_| |_| |_| |_| |_|
Daher gibt es 4 Möglichkeiten, eine 2 mal 2 Schokoladentafel aufzubrechen.
Regeln
Die Eingabe erfolgt über zwei Ganzzahlen (Funktionseingabe, STDIN, Befehlszeile oder ähnliches). Geben Sie eine einzelne Zahl aus, die Anzahl der Möglichkeiten zum Aufteilen des Schokoladenriegels.
Da die Zahlen ziemlich schnell ansteigen, machen Sie sich keine Sorgen, wenn die Ausgabe die Ganzzahlgrenzen Ihrer Sprache überschreitet - Ihre Übermittlung ist gültig, solange der Algorithmus theoretisch für alle möglichen Eingaben funktioniert.
Testfälle
Die Ausgabe hängt nicht von der Reihenfolge von ab m,n
, daher werden die Testfälle so aufgelistet 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 sind die Schokoladennummern, die in einem Dreieck so angeordnet sind, dass jede Zeile der Summe entspricht m+n
.
quelle
options(expressions=...)
und argument--max-ppsize=
) würde zu einem längeren Code als diesem führen.f=
.Python 2, 135 Bytes
Folgendes habe ich mir ausgedacht. Es ist sehr langsam, aber hier ist eine schnellere Version ( repoze.lru erforderlich ):
Beispiele
Erläuterung
Der Code definiert eine Funktion
C
, die ein Array von Teilen annimmt. Der Algorithmus ist als solcher:for i,Q in enumerate(A)
: Schleife durch die Reihe von Stücken.for W,H in(Q,Q[::-1])
: Berechne die Wege zweimal und drehe sie um 90 Grad.for c in range(1,W)
: mögliche Positionen durchlaufen, an denen geteilt werden soll.A[:i]+A[i+1:]+[(c,H),(W-c,H)]
: bekomme eine Liste ohne das geteilte Stück und mit den beiden neuen Stücken.C(…)
: Rufen Sie die Funktion in dieser Liste erneut auf.sum(…)
: summiere die Ergebnisse für jeden möglichen Split.or 1
: Wenn keine Teilung möglich ist, gibt es genau eine Möglichkeit, die Schokolade zu teilen.Schließlich wird der Code mit einem Array aufgerufen, das die Eingabe enthält.
quelle
ES6, 141 Bytes
Basierend auf der Formel von @CameronAavik. Ungolfed:
quelle