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
?Réponses:
CJam,
706259 octetsLit à partir de STDIN. Essayez-le en ligne.
Exemple d'exécution
Comment ça fonctionne
L'idée est de pousser toutes les chaînes de L et de S de la bonne longueur, d'appliquer successivement la transformation à chacune jusqu'à ce que le résultat soit une chaîne vide, de concaténer les séquences de chaînes et de rechercher les sous-chaînes interdites.
la source
GolfScript (86 octets)
Ceci est une approche inflationniste: elle commence par
L
etS
et les développe en utilisant les règlesLL -> SLS
,L -> S
,S -> LL
et avant ou arrièreS
peut avoir unL
ajouté à la limite de mot.Démo en ligne
la source
Haskell, 217
Explication:
Je définis 4 fonctions:
f
prend un entier et retourne le résultatreplicateM n [L,S]
crée toutes les permutations possibles de[L,S]
la longueurn
filter s ...
filtrera cette liste (des listes) avec la fonctions
r
réduit une liste donnée d'un niveau.Cela se fait simplement par correspondance de motifs. Une liste commençant par 2
L
deviendra une liste commençant parS
et la réduction restantev
valide une liste donnée par les règles données (pas 3 L continus, pas 2 S continus)si la liste commence par l'une des 2 séquences illégales (L, L, L ou S, S) le résultat est
False
, une liste vide est valide et une liste non vide est vérifiée à nouveau avec le premier élément supprimés
vérifie si une liste et toutes les listes réduites sont valides.Encore une fois: une liste vide est valide (et ne peut pas être réduite davantage).
Si la liste donnée en argument est valide, la liste est réduite et vérifiée à
s
nouveau.Sinon, le résultat est
False
la source