fundo
O mosaico de Fibonacci é um mosaico da linha (1D) usando dois segmentos: um curto, S e um longo, L (a razão de comprimento é a proporção áurea, mas isso não é relevante para esse desafio). Para que um ladrilho usando esses dois protótipos seja realmente um ladrilho de Fibonacci, as seguintes condições devem ser cumpridas:
- A lado a lado não deve conter a subsequência SS .
- A lado a lado não deve conter a LLL subsequente .
- Se um novo mosaico for composto executando todas as seguintes substituições, o resultado ainda deverá ser um mosaico de Fibonacci:
- LL → S
- S → L
- L → (string vazia)
Vejamos alguns exemplos:
SLLSLLSLLSLS
Parece um bloco válido, porque não contém dois * S * s ou três * L * s, mas vamos executar a composição:
LSLSLSLL
Ainda parece bom, mas se compormos isso de novo, obtemos
LLLS
que não é um mosaico válido de Fibonacci. Portanto, as duas seqüências anteriores também não eram válidas.
Por outro lado, se começarmos com
LSLLSLSLLSLSLL
e componha isso repetidamente para seqüências mais curtas
LSLLSLLS
LSLSL
LL
S
todos os resultados são inclinações válidas de Fibonacci, porque nunca obtemos SS ou LLL em lugar algum nessas cadeias.
Para uma leitura mais aprofundada, há uma tese que usa esse ladrilho como uma simples analogia 1D às inclinações de Penrose.
O desafio
Escreva um programa ou função que, dado um número inteiro não negativo N , retorne todos os blocos de Fibonacci válidos na forma de cadeias contendo N caracteres (sendo S
ou L
).
Você pode receber informações via argumento de função, STDIN ou ARGV e retornar ou imprimir o resultado.
Isso é código de golfe, a resposta mais curta (em bytes) vence.
Exemplos
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
?