背景
斐波那契平铺是(1D)线的平铺,使用两段:短段S和长段L(它们的长宽比是黄金比例,但这与这项挑战无关)。要将使用这两个原生动物的拼贴实际上是斐波那契拼贴,必须满足以下条件:
- 拼贴中不得包含子序列SS。
- 平铺中不得包含子序列LLL。
- 如果通过执行以下所有替换操作组成新的平铺,则结果仍必须是斐波那契平铺:
- LL → S
- S → L
- L → (空字符串)
让我们看一些例子:
SLLSLLSLLSLS
这看起来像是一个有效的平铺,因为它不包含两个* S *或三个* L * s,但让我们执行合成:
LSLSLSLL
看起来仍然不错,但是如果我们再次进行组合,我们会得到
LLLS
这不是有效的斐波那契平铺。因此,前两个序列也不是有效的平铺。
另一方面,如果我们从
LSLLSLSLLSLSLL
并反复将其组合成较短的序列
LSLLSLLS
LSLSL
LL
S
所有结果都是有效的斐波那契平铺,因为我们从未在这些字符串内的任何位置获得SS或LLL。
为了进一步阅读,有一篇论文将这种平铺作为与Penrose平铺的简单一维类比。
挑战
编写一个程序或函数,给定一个非负整数N,该程序或函数以包含N个字符(be 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
吗?