介绍
在这个挑战中,我们将使用非常差的伪随机数来模拟某个概率的细胞自动机。元胞自动机是通过以下本地规则在二进制字符串上定义的。假设一个单元格的左邻居和该单元格本身具有状态a
和b
。
- 如果为
min(a,b) == 0
,则的新状态b
为max(a,b)
。 - 如果为
min(a,b) == 1
,则b
从中随机选择的新状态{0,1}
。
下图显示了单个的可能的10步演变1
。
1
11
101
1111
11001
101011
1111111
10001001
110011011
1010111101
请注意,两个相邻的1
s有时如何演变为1
,有时演变为,并且0
最边界位始终1
是s。您的任务是产生这种形式的细胞自动机进化。
输入项
您的输入是一个正整数n
(表示要显示的行数),以及一个非空的位列表(L
我们将其用作随机性来源)。
输出量
您的输出是一个列表列表或2D位数组,如上图所示,描述了单个对象1
在n
时间步长上的演变。0
如果需要,可以用s 填充输出以获取相等长度的行,但不能以0
s开头。
元胞自动机中的随机选择必须从列表中得出,L
用尽时会跳回到开头。更明确地讲,如果输出从上到下,从左到右一次遍历一行,那么连续的随机选择将形成L
重复所需次数的列表。
例
假设输入是n = 7
和L = [0,1,0]
。然后,细胞自动机在以下7个步骤中演化如下,其中我们v
在每个随机选择上方都放置了一个右键:
[1]
[1,1]
v
[1,0,1]
[1,1,1,1]
v v v
[1,1,0,0,1]
v
[1,1,1,0,1,1]
v v v
[1,0,0,1,1,1,1]
如果我们读取所有标有a的位,则会v
得到01001001
,该值L
重复2.66次。下一个随机位是0
。
规则和计分
您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。输入和输出的确切格式不重要(在合理范围内)。
测试用例
确定性版本,每个随机位是0
:
Inputs: 10 [0]
Output:
1
11
101
1111
10001
110011
1010101
11111111
100000001
1100000011
每个随机位是1
:
Inputs: 6 [1,1]
Output:
1
11
111
1111
11111
111111
伪随机版本:
Inputs: 10 [0,0,1]
Output:
1
11
101
1111
10101
111111
1010011
11110101
101011111
1111101001
Inputs: 10 [1,0,0,1]
Output:
1
11
111
1001
11011
111111
1001101
11010111
111111101
1011001111
Inputs: 15 [1,1,1,0,0,0]
Output:
1
11
111
1111
10001
110011
1110111
11011001
111111011
1100011111
11100100011
111101100101
1001111101111
11011000111111
101101001011101
min(a,b)
用a+b>1
和max(a,b)
用a+b
?我意识到您可能必须做一些事情来处理1
->的第一种情况11
(我想您可以这样做L=[1]+f()...
,或者找到某种在其前面插入1的方法,L
因为第二行总是会弹出1)