110规则
* * * *
拉格朗日计划
* * * *
110规则

110规则元胞自动机是一种按规则演化的自动机。想像有一条无限长的纸带,被分割成无限个相同的格子,每一格称为一个元胞。

每个元胞有死活两种状态,分别用0和1表示。

每一轮中每个元胞都会根据其当前状态和其左右相邻格的状态演化,具体规则如下:

111 -> 0
110 -> 1
101 -> 1
100 -> 0
011 -> 1
010 -> 1
001 -> 1
000 -> 0
箭头左侧分别描述了左邻、当前元胞、右邻三个元胞的当前状态,右侧描述了当前元胞演化后的状态,1表示活元胞,0表示死元胞。

以只有一个活元胞为初始状态,计算前99次演化,并将所得的100个状态按每个状态一行的方式打印出来。用“█”表示活元胞,用“ ”表示死元元胞,打印时右对齐,例如以下是输出的前10行(为便于对齐,用X代替█):
         X
        XX
       XXX
      XX X
     XXXXX
    XX   X
   XXX  XX
  XX X XXX
 XXXXXXX X
XX     XXX


本题难度:



解答

用字符串a记录当前状态,每次从左到右遍历,提取三个字符(在a头部加入一个死细胞以方便处理左边界,容易看出右边界恒为活细胞因此不用处理)并计算下一个状态。

只用三种状态会导致元胞死亡,因此检查提取的子串是否是这三者之一即可。

最终代码有四行。

代码长度:108字节 vs. 全站第一:70字节。

z,s="█ ",range(100)
y,x=z
a=x*99+y
for i in s:print(a);a="".join(z[(x+a)[j:j+3]in(y*3,x*3,z+x)]for j in s)