识别细胞自动机的序列


10

背景

出于这一挑战的目的,n-state元胞自动机只是一个二进制函数f,该函数从状态集中获取两个数字{0, 1, ..., n-1}作为输入,然后从该集合返回另一个数字作为输出。可以将其应用于长度至少为2 的数字列表L = [x0, x1, x2, ..., xk-1]

f(L) = [f(x0, x1), f(x1, x2), f(x2, x3), ..., f(xk-2, xk-1)]

请注意,结果列表比原始列表少一个元素。甲时空图f从开始L是通过重复应用获得列表的列表fL,并收集在一个列表中的结果。最终列表具有长度为1,我们就说该列表L识别序列f,如果在所述状态集合中每两个元素的列表是从开始时空图的一些行的连续子列表L。这相当于没有其他n状态的CA具有确切的时空图的条件。

输入值

您的输入是一个n-by- n整数矩阵M,整数列表L至少2的长度,和任选的数目n。矩阵通过(使用基于0的索引)M定义n-stateCA 。确保和并且仅包含状态集的元素。ff(a,b) = M[a][b]n > 0ML{0, 1, ..., n-1}

输出量

如果L是CA的识别序列,则您的输出应为f一致的真实值,否则为一致的虚假值。这意味着所有“是”实例产生相同的真实值,而所有“否”实例产生相同的虚假值。

考虑输入n = 2M = [[0,1],[1,0]]以及L = [1,0,1,1]。矩阵M定义了二进制XOR自动机f(a,b) = a+b mod 2,并且时空图从Lis 开始

1 0 1 1
1 1 0
0 1
1

此图0 0在任何行上均不包含,因此L也不是标识序列,正确的输出为False。如果我们L = [0,1,0,0]改为输入,则时空图为

0 1 0 0
1 1 0
0 1
1

该图的行包含从状态集合绘制所有对,即0 00 11 01 1,所以L是这样的识别序列,并且正确的输出是True

规则

您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。

测试用例

Trivial automaton
[[0]] [0,0] 1 -> True
Binary XOR
[[0,1],[1,0]] [1,0,1,1] 2 -> False
[[0,1],[1,0]] [1,0,1,0] 2 -> True
[[0,1],[1,0]] [0,1,0,0] 2 -> True
Addition mod 3
[[0,1,2],[1,2,0],[2,0,1]] [0,1,1,0,0,0,1,0,0] 3 -> False
[[0,1,2],[1,2,0],[2,0,1]] [0,1,1,0,0,0,1,0,1] 3 -> True
Multiplication mod 3
[[0,0,0],[0,1,2],[0,2,1]] [0,1,1,2,0,0,1,0,1] 3 -> False
[[0,0,0],[0,1,2],[0,2,1]] [0,1,1,2,2,2,1,0,1] 3 -> True
Some 4-state automata
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,0,0,0,1,1,1,1] 4 -> False
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,0,0,1,0,1,1,1] 4 -> False
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,1,2,3,3,1,2,3,0] 4 -> True
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,0,1,1,2,2,0,2,1] 4 -> False
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,3,1,3,2,3,3,0,1] 4 -> False
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,3,1,3,2,3,3,0,1,2] 4 -> True

Answers:


2

CJam,53 43 42字节

l~:M;_,({_[\1>]zW<_{M\{=}/}%}*;](_*\L*_&,=

这是该定义的非常简单的实现(第一次尝试后,我从Jakube那里得到了一些启发)。它期望使用CJam样式的数组在STDIN上以相反的顺序输入:

2 [1 0 1 1] [[0 1][1 0]]

这是一个测试工具,可对所有输入运行代码(首先将其转换为正确的输入格式)。输入字段中的结果并未实际使用。如果您不信任我,请将其删除。;)


5

Python 2:93字节

M,L,n=input();a=[]
while L:z=zip(L,L[1:]);a+=z;L=[M[i][j]for i,j in z]
print len(set(a))==n*n

简单实现:通过压缩查找所有对,将它们存储起来以备后用,然后将M应用于L。重复。比较找到的唯一对的数量。

输入为形式[[0,1],[1,0]], [0,1,0,0], 2


2

Mathematica,90 83 82字节

f=Length[Union@@Last@Reap[#2//.l_List:>Extract[#,Sow/@Partition[l+1,2,1]]]]==#3^2&

另一个简单的实现。

用法:

f[{{0, 1}, {1, 0}}, {0, 1, 0, 0}, 2]

真正

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.