Antecedentes
El mosaico de Fibonacci es un mosaico de la línea (1D) que utiliza dos segmentos: uno corto, S y uno largo, L (su relación de longitud es la relación de oro, pero eso no es relevante para este desafío). Para que un mosaico que utiliza estos dos prototipos sea realmente un mosaico de Fibonacci, se deben cumplir las siguientes condiciones:
- El mosaico no debe contener la subsecuencia SS .
- El mosaico no debe contener la subsecuencia LLL .
- Si un nuevo mosaico se compone realizando todas las sustituciones siguientes, el resultado debe ser un mosaico de Fibonacci:
- LL → S
- S → L
- L → (cadena vacía)
Veamos algunos ejemplos:
SLLSLLSLLSLS
Esto parece un mosaico válido, porque no contiene dos * S * so tres * L * s, pero realicemos la composición:
LSLSLSLL
Eso todavía se ve bien, pero si volvemos a componer esto, obtenemos
LLLS
que no es un mosaico válido de Fibonacci. Por lo tanto, las dos secuencias anteriores tampoco eran válidas.
Por otro lado, si comenzamos con
LSLLSLSLLSLSLL
y componer esto repetidamente en secuencias más cortas
LSLLSLLS
LSLSL
LL
S
todos los resultados son inclinaciones de Fibonacci válidas, porque nunca obtenemos SS o LLL en ningún lugar dentro de esas cadenas.
Para leer más, hay una tesis que usa este mosaico como una simple analogía 1D a las inclinaciones de Penrose.
El reto
Escriba un programa o función que, dado un número entero no negativo N , devuelva todos los mosaicos de Fibonacci válidos en forma de cadenas que contienen N caracteres (being S
o L
).
Puede tomar la entrada a través del argumento de función, STDIN o ARGV y devolver o imprimir el resultado.
Este es el código golf, gana la respuesta más corta (en bytes).
Ejemplos
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
?Respuestas:
CJam,
706259 bytesLecturas de STDIN. Pruébalo en línea.
Ejecución de ejemplo
Cómo funciona
La idea es empujar todas las cadenas de L y S de la longitud adecuada, aplicar sucesivamente la transformación a cada una hasta que el resultado sea una cadena vacía, concatenar las secuencias de cadenas y buscar las subcadenas prohibidas.
fuente
GolfScript (86 bytes)
Este es un enfoque inflacionario: comienza con
L
yS
, y los amplía el uso de las reglasLL -> SLS
,L -> S
,S -> LL
, y el principio o al finalS
puede tener unL
añadido en el límite de palabra.Demostración en línea
fuente
Haskell, 217
Explicación:
Defino 4 funciones:
f
toma un entero y devuelve el resultadoreplicateM n [L,S]
crea todas las permutaciones posibles[L,S]
con la longitudn
filter s ...
filtrará esta lista (de listas) con la funcións
r
reduce una lista dada en 1 nivel.Esto se hace simplemente por coincidencia de patrones. Una lista que comienza con 2
L
se convertirá en una lista que comience conS
el restov
valida una lista dada por las reglas dadas (no 3 continuas L, no 2 continuas S)si la lista comienza con una de las 2 secuencias ilegales (L, L, L o S, S), el resultado es que
False
una lista vacía es válida y una lista no vacía se verifica nuevamente con el primer elemento eliminados
comprueba si una lista y todas las listas reducidas son válidas.Nuevamente: una lista vacía es válida (y no se puede reducir más).
Si la lista dada como argumento es válida, la lista se reduce y se
s
vuelve a verificar .De lo contrario, el resultado es
False
fuente