Фон
Черепица Фибоначчи - это чередование линии (1D) с использованием двух сегментов: короткого S и длинного L (их отношение длины - золотое сечение, но это не относится к этой задаче). Чтобы плитка, использующая эти два прототипа, фактически была плиткой Фибоначчи, должны быть выполнены следующие условия:
- Черепица не должна содержать подпоследовательность SS .
- Черепица не должна содержать подпоследовательность LLL .
- Если новый лист составлен путем выполнения всех следующих подстановок, результатом по-прежнему должен быть лист Фибоначчи:
- LL → S
- S → L
- L → (пустая строка)
Давайте посмотрим на некоторые примеры:
SLLSLLSLLSLS
Это похоже на правильный лист, потому что он не содержит двух * S * s или трех * L * s, но давайте выполним композицию:
LSLSLSLL
Это все еще выглядит хорошо, но если мы составим это снова, мы получим
LLLS
что не является действительным тайлингом Фибоначчи. Следовательно, две предыдущие последовательности также не были действительными значениями.
С другой стороны, если мы начнем с
LSLLSLSLLSLSLL
и многократно составлять это для более коротких последовательностей
LSLLSLLS
LSLSL
LL
S
все результаты являются действительными значениями Фибоначчи, потому что мы нигде не получаем SS или LLL внутри этих строк.
Для дальнейшего чтения есть тезис, в котором эта мозаика используется как простая одномерная аналогия мозаики Пенроуза.
Соревнование
Напишите программу или функцию, которая, учитывая неотрицательное целое число N , возвращает все допустимые листы Фибоначчи в виде строк, содержащих N символов (являющихся S
или L
).
Вы можете получить ввод через аргумент функции, STDIN или ARGV и вернуть или распечатать результат.
Это код гольф, самый короткий ответ (в байтах) выигрывает.
Примеры
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
?Ответы:
CJam,
706259 байтЧитает из STDIN. Попробуйте онлайн.
Пример запуска
Как это работает
Идея состоит в том, чтобы вытолкнуть все строки L и S надлежащей длины, последовательно применять преобразование к каждой строке, пока результат не станет пустой строкой, объединить последовательности строк и найти запрещенные подстроки.
источник
GolfScript (86 байт)
Это инфляционный подход: она начинается с
L
иS
и расширяет их , используя правилаLL -> SLS
,L -> S
,S -> LL
и начальные или конечныеS
могут иметьL
добавлены на границе слова.Онлайн демо
источник
Хаскелл, 217
Explaination:
Я определяю 4 функции:
f
принимает целое число и возвращает результатreplicateM n [L,S]
создаст все возможные перестановки[L,S]
с длинойn
filter s ...
, отфильтрует этот список (списков) с помощью функцииs
r
уменьшает данный список на 1 уровень.Это просто делается путем сопоставления с образцом. Список, начинающийся с 2
L
, станет списком, начинающимся сS
уменьшенных оставшихсяv
проверяет данный список по заданным правилам (нет 3 непрерывных L, нет 2 непрерывных S)если список начинается с одной из 2 недопустимых последовательностей (L, L, L или S, S), в результате получается
False
пустой список, и непустой список снова проверяется с удалением первого элементаs
проверяет, является ли список и все сокращенные списки действительными.Опять же: пустой список действителен (и не может быть уменьшен в дальнейшем).
Если список, указанный в качестве аргумента, действителен, то список сокращается и проверяется
s
снова.В противном случае результат
False
источник