Hintergrund
Die Fibonacci-Kachelung ist eine Kachelung der (1D) -Linie mit zwei Segmenten: einem kurzen, S , und einem langen, L (ihr Längenverhältnis ist das goldene Verhältnis, aber das ist für diese Herausforderung nicht relevant). Damit eine Kachelung mit diesen beiden Prototilen tatsächlich eine Fibonacci-Kachelung ist, müssen folgende Bedingungen erfüllt sein:
- Die Kachelung darf nicht die Teilsequenz SS enthalten .
- Die Kachelung darf nicht die Teilsequenz LLL enthalten .
- Wenn eine neue Kachelung durch Ausführen aller folgenden Ersetzungen erstellt wird, muss das Ergebnis immer noch eine Fibonacci-Kachelung sein:
- LL → S.
- S → L.
- L → (leere Zeichenfolge)
Schauen wir uns einige Beispiele an:
SLLSLLSLLSLS
Dies sieht aus wie eine gültige Kachelung, da sie keine zwei * S * s oder drei * L * s enthält, aber lassen Sie uns die Komposition ausführen:
LSLSLSLL
Das sieht immer noch gut aus, aber wenn wir das noch einmal komponieren, bekommen wir
LLLS
Dies ist keine gültige Fibonacci-Kachelung. Daher waren auch die beiden vorherigen Sequenzen keine gültigen Kacheln.
Auf der anderen Seite, wenn wir mit beginnen
LSLLSLSLLSLSLL
und komponiere dies wiederholt zu kürzeren Sequenzen
LSLLSLLS
LSLSL
LL
S
Alle Ergebnisse sind gültige Fibonacci-Kacheln, da wir innerhalb dieser Zeichenfolgen niemals SS oder LLL erhalten .
Zur weiteren Lektüre gibt es eine These, die diese Kacheln als einfache 1D-Analogie zu Penrose-Kacheln verwendet.
Die Herausforderung
Schreiben Sie ein Programm oder eine Funktion, die bei einer nicht negativen Ganzzahl N alle gültigen Fibonacci-Kacheln in Form von Zeichenfolgen mit N Zeichen (Sein S
oder L
) zurückgibt .
Sie können Eingaben über das Funktionsargument STDIN oder ARGV vornehmen und das Ergebnis zurückgeben oder drucken.
Dies ist Code Golf, die kürzeste Antwort (in Bytes) gewinnt.
Beispiele
N Output
0 (an empty string)
1 S, L
2 SL, LS, LL
3 LSL, SLS, LLS, SLL
4 SLSL, SLLS, LSLS, LSLL, LLSL
5 LLSLL, LLSLS, LSLLS, LSLSL, SLLSL, SLSLL
...
8 LLSLLSLS, LLSLSLLS, LSLLSLLS, LSLLSLSL, LSLSLLSL, SLLSLLSL, SLLSLSLL, SLSLLSLL, SLSLLSLS
LSLSL
->LL
?Antworten:
CJam,
706259 BytesLiest von STDIN. Probieren Sie es online aus.
Beispiellauf
Wie es funktioniert
Die Idee ist, alle Zeichenfolgen von L und S mit der richtigen Länge zu verschieben, die Transformation nacheinander auf jede anzuwenden, bis das Ergebnis eine leere Zeichenfolge ist, die Folgen von Zeichenfolgen zu verketten und nach den verbotenen Teilzeichenfolgen zu suchen.
quelle
GolfScript (86 Bytes)
Dies ist ein Inflations Ansatz: es beginnt mit
L
undS
und erweitert sie die Regeln mitLL -> SLS
,L -> S
,S -> LL
, und am Anfang oder EndeS
kann eine hatL
an der Wortgrenze gegeben.Online-Demo
quelle
Haskell, 217
Erklärung:
Ich definiere 4 Funktionen:
f
nimmt eine ganze Zahl und gibt das Ergebnis zurückreplicateM n [L,S]
Erstellt alle möglichen Permutationen[L,S]
mit der Längen
filter s ...
, filtert diese Liste (von Listen) mit der Funktions
r
reduziert eine gegebene Liste um 1 Stufe.Dies erfolgt einfach durch Mustervergleich. Eine Liste, die mit 2 beginnt,
L
wird zu einer Liste, die mit beginntS
und die verbleibende reduziertv
validiert eine gegebene Liste nach den gegebenen Regeln (kein 3 kontinuierliches L, kein 2 kontinuierliches S)Wenn die Liste mit einer der beiden unzulässigen Sequenzen (L, L, L oder S, S) beginnt, ist das Ergebnis
False
, dass eine leere Liste gültig ist und eine nicht leere Liste erneut überprüft wird, wobei das erste Element entfernt wirds
prüft, ob eine Liste und alle reduzierten Listen gültig sind.Nochmals: Eine leere Liste ist gültig (und kann nicht weiter reduziert werden).
Wenn die als Argument angegebene Liste gültig ist, wird die Liste reduziert und
s
erneut überprüft .Ansonsten ist das Ergebnis
False
quelle