我在玩蜂窝自动机,发现其中的一种有趣的行为。运作方式如下:
它从左到右读取一个二进制字符串,如果遇到一个1
后跟2
其他值的二进制字符串,它将0
在结果后面追加一个并继续读取。如果遇到a 0
(或剩余少于3个值),它将附加当前值和a 1
并继续读取。在字符串的末尾,它将1
在结果后附加一个。
这是一代人的例子
01011111
^
我们首先遇到a,0
因此我们将其追加01
到结果中
01011111
^
01
现在我们遇到一个,1
所以我们附加一个零并跳过接下来的两个值
01011111
^
010
我们遇到另一个,1
所以我们也一样
01011111
^
0100
现在,我们还有另一个1
但没有足够的空间可以跳转,因此我们附加了当前单元格和一个1
(在这种情况下11
)
01011111
^
010011
我们已经结束了,所以我们追加一个1
并终止这一代
01011111
^
0100111
任务
给定任何合理格式的输入,您必须创建一个计算一代自动机的函数或程序。
这是一个代码问题,因此答案将以字节计分,而字节越少越好。
实施范例
这是Haskell中的示例实现(定义了一个函数d
,但是程序无限期地打印迭代):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
应该打印11011
?我认为更多测试用例会有所帮助