Ich habe beim Stöbern in Stackoverflow diese Frage zum Kacheln eines MxN-Rechtecks gesehen und dachte, es wäre großartig zum Golfen. Hier ist die Aufgabe.
In Anbetracht der Dimensionen M und N schreiben Sie ein Programm, das ausgibt, wie viele eindeutige Arten ein MxN-Rechteck (N ist die Anzahl der Zeilen, nicht die Anzahl der Spalten. Nicht, dass es wirklich wichtig ist) unter Berücksichtigung dieser Einschränkungen nebeneinander angeordnet werden kann.
- Alle Kacheln sind 2x1 oder 3x1
- Alle Kacheln bleiben in ihrer Reihe (dh sie sind alle horizontal)
- Zwischen jeweils zwei benachbarten Reihen sollten außer an den beiden Enden keine Kacheln ausgerichtet werden
- M und N sind garantiert mindestens 1
Zum Beispiel wäre eine gültige Kachelung einer 8x3-Matrix
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|_____|___|
|___|_____|_____|
Das Folgende wäre jedoch ungültig, da die Zeilen ausgerichtet sind
2 3 3
| | |
v v v
_______________
|___|_____|_____|
|_____|___|_____|
|_____|_____|___|
Testfälle:
8x3: 4
3x1: 1
1x1: 0
9 x 4: 10
Code Golf, so dass die kürzeste Antwort gewinnt.
2x1
oder3x1
? Ist auch die Ausgabe für4x1
Null?|
s nicht zur Länge der Zeile beizutragen, indem eine Darstellung wie diese verwendet wurde (wenn keine Pipe|
vorhanden ist, ist ein Leerzeichen vorhanden).Antworten:
Gelee , 20 Bytes
Probieren Sie es online!
quelle
JavaScript (ES6),
119 110 106 9691 ByteProbieren Sie es online!
Kommentiert
quelle
R ,
243231 BytesProbieren Sie es online!
Version mit Zeilenumbrüchen:
Man beachte keine Rekursion und handhabt ziemlich große Werte von m und n (zB 24x20 -> 3.3e19)
Hier ist eine kommentierte Antwort, die mehr oder weniger wie oben funktioniert, aber ich habe alle Funktionen nicht verschachtelt, damit sie tatsächlich lesbar sind:
Die Methode zum Aufnehmen und wiederholten Multiplizieren einer Matrix ergibt sich aus einer Frage zum Stapelüberlauf . Dieser Ansatz funktioniert hier, weil er effektiv die kumulative Anzahl von Zweigen durch die verschiedenen möglichen Reihen von Steinen berechnet.
Wenn externe Pakete erlaubt sind, kann ich es auf 192 bringen:
quelle
Gelee , 26 Bytes
Probieren Sie es online!
Heruntergebrochen:
Generieren Sie eine Liste möglicher Wände als kumulative Summe, wobei das Ende entfernt wird:
Finden Sie die äußere Tabelle aller möglichen Wände gegeneinander, die keine Schnittpunkte haben:
Nimm diese Matrix hoch (N-1) und fasse alles zusammen:
Verwendet das erste Bit aus @ EriktheOutgolfers Antwort, um die Liste der möglichen Wände zu generieren, und verwendet dann den Matrixschnittpunkt- und Matrixexponentierungsansatz aus meiner R-Antwort. Als solches funktioniert es auch mit großem N. Dies ist meine erste Gelee-Antwort, und ich vermute, es kann mehr Golf gespielt werden. Idealerweise möchte ich auch den ersten Abschnitt so ändern, dass der Zeit- und Speicherbedarf nicht exponentiell mit M skaliert.
quelle
05AB1E , 42 Bytes
Ich schäme mich fast, dies zu posten, und es kann definitiv von VIELEN mit einer anderen Herangehensweise golfen werden, aber da es eine Weile gedauert hat, habe ich beschlossen, es trotzdem zu posten und von hier aus zu golfen. Die Herausforderung sieht einfacher aus als es imo ist, aber ich gehe hier definitiv falsch vor und habe das Gefühl, dass 05AB1E ungefähr 25 Bytes schaffen könnte.
Probieren Sie es online aus. HINWEIS: Es ist nicht nur lang, sondern auch ineffizient, da der
9x4
Testfall unter TIO in etwa 40 Sekunden ausgeführt wird.Erläuterung:
quelle
Kohle , 89 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Funktioniert mit TIO für Rechtecke mit einer Größe von bis zu etwa 12, kann jedoch mit einem Aufwand von 2 Bytes etwa dreimal schneller ausgeführt werden, indem Bit-Twiddling anstelle von Listenschnitt verwendet wird. Erläuterung:
Geben Sie die Breite ein.
Beginnen Sie mit einer Reihe ohne Steine.
Beginnen Sie ohne abgeschlossene Zeilen.
Schleife über die Reihen.
Schlinge dich über die Ziegel.
Fügen Sie die Ziegelbreite zur aktuellen Zeilenbreite hinzu.
Wenn dies zu einer Eingabebreite führt, fügen Sie diese Zeile der Liste der abgeschlossenen Zeilen hinzu.
Andernfalls, wenn dies immer noch weniger als die Eingabebreite ist, fügen Sie die neue Zeile zur Liste der Zeilen hinzu, sodass sie bei einer späteren Iteration erfasst wird.
Machen Sie eine Liste von Wänden einer Reihe.
Schleife über eine weniger als die Höhe.
Speichern Sie die Liste der Wände.
Löschen Sie die Liste der Wände.
Durchlaufen Sie die gespeicherte Liste der Wände.
Schleife über die fertigen Zeilen.
Wenn die Zeile zu dieser Wand hinzugefügt werden kann, fügen Sie sie der Liste der Wände hinzu.
Geben Sie die Länge der endgültigen Liste der Wände aus.
quelle