Contexte
Le pavage Fibonacci est un pavage de la ligne (1D) utilisant deux segments: un court, S et un long, L (leur rapport de longueur est le nombre d'or, mais ce n'est pas pertinent pour ce défi). Pour qu'un carrelage utilisant ces deux prototiles soit réellement un carrelage de Fibonacci, les conditions suivantes doivent être remplies:
- Le pavage ne doit pas contenir la sous-séquence SS .
- Le pavage ne doit pas contenir la sous-séquence LLL .
- Si un nouveau pavage est composé en effectuant toutes les substitutions suivantes, le résultat doit toujours être un pavage de Fibonacci:
- LL → S
- S → L
- L → (chaîne vide)
Regardons quelques exemples:
SLLSLLSLLSLS
Cela ressemble à un pavage valide, car il ne contient pas deux * S * ou trois * L * mais effectuons la composition:
LSLSLSLL
Cela semble toujours bien, mais si nous composons à nouveau cela, nous obtenons
LLLS
qui n'est pas un pavage Fibonacci valide. Par conséquent, les deux séquences précédentes n'étaient pas non plus des pavages valides.
D'un autre côté, si nous commençons par
LSLLSLSLLSLSLL
et composer à plusieurs reprises cela en séquences plus courtes
LSLLSLLS
LSLSL
LL
S
tous les résultats sont des pavages de Fibonacci valides, car nous n'obtenons jamais SS ou LLL n'importe où à l'intérieur de ces chaînes.
Pour une lecture plus approfondie, il existe une thèse qui utilise ce pavage comme une simple analogie 1D aux pavages Penrose.
Le défi
Écrivez un programme ou une fonction qui, étant donné un entier non négatif N , retourne tous les pavages de Fibonacci valides sous la forme de chaînes contenant N caractères (étant S
ou L
).
Vous pouvez saisir des données via l'argument de fonction, STDIN ou ARGV et retourner ou imprimer le résultat.
C'est le golf de code, la réponse la plus courte (en octets) l'emporte.
Exemples
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
?