Tor
Ziel dieser Herausforderung ist es, eine Funktion zu erstellen, mit n
der die Anzahl der Möglichkeiten berechnet wird, das n X 1
Gitter in Dreiecke zu unterteilen, bei denen sich alle Eckpunkte der Dreiecke auf Gitterpunkten befinden.
Beispiel
Zum Beispiel gibt es 14 Möglichkeiten, das 2 x 1-Gitter zu unterteilen, also f(2) = 14
über die folgenden Partitionen, bei
denen die Partitionen 2, 2, 2, 2, 4 bzw. 2 unterschiedliche Ausrichtungen haben.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code.
code-golf
geometry
combinatorics
grid
Peter Kagey
quelle
quelle
Antworten:
05AB1E , 13 Bytes
Port of @Bubbler 's Jelly Antwort .
Sehr langsam aufgrund der eingebauten Permutationen.
Probieren Sie es online aus oder überprüfen Sie die ersten vier Eingaben .
Erläuterung:
quelle
Haskell ,
60 55 5452 BytesNach dem Zeichnen und Programmieren vieler Beispiele ist mir aufgefallen, dass dies dasselbe ist wie das Problem der Türme:
Grundsätzlich haben Sie die obere und die untere Linie des1 × n Gitters. Jetzt müssen Sie die nicht horizontale Linie ausfüllen. Jedes Dreieck muss zwei nicht horizontale Linien haben. Ob eine seiner Seiten Teil der oberen oder unteren Linie ist, hängt von der Richtung und Länge ab, in die Sie beim Turmproblem gehen würden. Dies ist OEIS A051708 . Betrachten Sie zur Veranschaulichung dieser Entsprechung die folgenden Beispiele. Hier entspricht die obere Zeile Aufwärtsbewegungen, während die untere Zeile Rechtsbewegungen entspricht.
Vielen Dank an @PeterTaylor für -6 Bytes und @PostLeftGarfHunter für -2 Bytes!
Probieren Sie es online!
quelle
A051708(n+1)
. Also habe ich die erste richtige Antwort gepostet :-PHaskell , 42 Bytes
Probieren Sie es online!
Eine ziemlich direkte Implementierung, die über 2 Variablen rekursiv ist.
So können wir diese Lösung erhalten. Beginnen Sie mit dem Code, der eine direkte rekursive Formel implementiert:
54 Bytes
Probieren Sie es online!
Mit flawr der Saatkrähe bewegen Interpretation ,
a%b
ist die Anzahl der Pfade, die die Saatkrähe bekommen von(a,b)
zu(0,0)
verwenden nur die Abnahme bewegt sich eine Koordinate. Der erste Zug nimmt entweder aba
oder abb
, der andere bleibt gleich, daher die rekursive Formel.49 Bytes
Probieren Sie es online!
Wir können die Wiederholung vermeiden,
map(a%)[0..b-1]++map(b%)[0..a-1]
indem wir feststellen, dass die beiden Hälften gleicha
undb
vertauscht sind. Der Hilfsaufrufa?b
zählt die Pfade, auf denen der erste Zug abnimmta
, und somit auch die Pfade, aufb?a
denen der erste Zug abnimmtb
. Diese sind im Allgemeinen unterschiedlich und tragen dazu beia%b
.Die Summation in
a?b
kann auch als Listenverständnis geschrieben werdena?b=sum[a%i|i<-[0..b-1]]
.42 Bytes
Probieren Sie es online!
Zum Schluss werden wir
%
die Rekursion los und schreiben sie einfach?
durch Ersetzena%i
durcha?i+i?a
in den rekursiven Aufruf.Der neue Basisfall führt dazu
?
, dass die Ausgaben doppelt so hoch sind wie?
in der 49-Byte-Version, da dies bei0?0=1
hätte sein müssen0%0=0?0+0?0=2
. Auf diese Weise können Sie define verwenden,f n=n?n
ohne die Halbierung, die wir sonst benötigen würden.quelle
a%b
zählt die Anzahl der Partitionen anhand der Knoten0,1,...,a
in der oberen Zeile und der Knoten0,1,..,b
in der unteren Zeile. Der Operatora?b
zählt die Anzahl der Möglichkeiten, wie Sie vom oberen Knoten aus eine neue Zeile hinzufügen können,a
wenn der untere Knotenb
bereits verwendet wird. (Sie können eine Verbindunga
zu allen Knoten herstellen[0,1,...,b-1]
, müssen dann jedoch für jeden Knoten eine neue Verbindung herstellen.)?
von dem 42-Byte, das ich nicht habe, und was besonders merkwürdig ist, dass es nicht symmetrisch ist.map...
ein Listenverständnis ersetzen , im zweiten Schritt fügen wir einfach die Definition von%
:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a
a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a
a?b=sum[a?i+i?a|i<-[0..b-1]]
CJam (24 Bytes)
Online-Demo
Dies verwendet den Bubbler-Ansatz der Summierung über Permutationen von
n
0s undn
1s.Präparation
Alternativer Ansatz (28 Byte)
Online-Demo
Präparation
Die Dreiecke haben alle eine horizontale Kante und zwei Kanten, die die horizontalen Linien verbinden. Beschriften Sie die nicht horizontalen Kanten mit einem Tupel der beiden x-Koordinaten und sortieren Sie sie lexikografisch. Dann ist die erste Kante
(0,0)
die letzte Kante(n,n)
und zwei aufeinanderfolgende Kanten unterscheiden sich in genau einer der beiden Positionen. Dies führt zu einer einfachen Rekursion, die ich mit dem memoised-Rekursionsoperator implementiert habej
:Hinweis
Dies ist nicht das erste Mal, dass ich
fj
in CJam unterstützt werden möchte. Hier würde es auch die Punktzahl auf 24 Bytes senken. Vielleicht sollte ich versuchen, einen Patch zu schreiben ...quelle
Jelly ,
15 bis14 BytesProbieren Sie es online!
-1 Byte basierend auf Peter Taylors Kommentar.
Verwendet die Abbildung von flawr direkt anstelle der resultierenden Formel.
Wie es funktioniert
Nehmen Sie jede mögliche Route in einem quadratischen Raster. Die Anzahl der Möglichkeiten, L-Einheiten als Turm in eine Richtung zu bewegen, ist
2**(L-1)
. Wenden Sie dies auf jede Route an und addieren Sie die Anzahl der Wege, um jede Route zu durchlaufen.quelle
Holzkohle ,
4431 Bytesdurchgestrichen 44 ist immer noch regulär 44
Probieren Sie es online! Erläuterung: Berechnet die Anzahl der Möglichkeiten, ein Trapez mit entgegengesetzten Seitenlängen
m,n
in Dreiecke zu unterteilen, die alle auf ganzzahligen Offsets liegen. Dies ist einfach ein allgemeiner Fall desn
in der Frage genannten Größenrechtecks . Die Anzahl der Partitionen wird rekursiv als Summe der Anzahl der Partitionen für alle Seitenm,0..n-1
und angegebenn,0..m-1
. Dies entspricht dem verallgemeinerten Problem der Türme , OEIS A035002 . Der Code berechnet einfach die Anzahl der Partitionen, die von0,0
bis zun,n
den zuvor berechneten Werten arbeiten.Schleife über die Reihen
0..n
.Beginnen Sie mit einer leeren Zeile.
Schleife über die Spalten in der Reihe
0..n
.Nehmen Sie die bisherige Zeile und die Werte in den vorherigen Zeilen in der aktuellen Spalte und addieren Sie die Gesamtsumme zur aktuellen Zeile. Wenn es jedoch überhaupt keine Werte gibt, ersetzen Sie sie
1
die Summe durch.Fügen Sie die fertige Zeile zur Liste der bisherigen Zeilen hinzu.
Den berechneten Endwert ausgeben.
quelle
JavaScript (ES6),
45 4442 ByteVerwendet die von Peter Taylor und flawr gefundene rekursive Formel .
Probieren Sie es online!
quelle
Pari / GP , 43 Bytes
Nach OEIS ist die Erzeugungsfunktion dieser Sequenz
Probieren Sie es online!
quelle
Python 3 , 51 Bytes
Probieren Sie es online!
Antwort von Port of Flawr
quelle