搜索图样 - AlephAlpha/LifeFind GitHub Wiki

包里用来搜索图样的函数是 SearchPatternLifeFind。其用法完全一样,区别在于 SearchPattern 输出的是一个数组,而 LifeFind 输出的是图片,并且给出图样的 RLE,以便复制粘贴到 Golly 中。

Screenshot

LifeFind[x, y, p, dx, dy] 搜索的是大小不超过 (x, y),周期为 p,每个周期平移 (dx, dy) 的图样。比如说,要搜索生命游戏中大小不超过 5×16,周期为 3,速度为 c/3 的竖直方向的飞船(25P3H1V0.1),只需要:

LifeFind[5, 16, 3, 1, 0]

可以省略 dxdy,此时默认 dxdy 都是 0,也就是说搜索的是静物或者振荡子。如果连 p 也省略,则默认周期是 1,也就是说搜索的是静物。

搜索结果是随机的,搜索需要的时间也很不稳定。通常来说,搜索范围越大,周期越长,可能的结果越稀少,搜索的时间就越长。如果搜索时间过长,可以用 Alt+. (在命令行界面是 Ctrl+C)来中断。对于稍大的或者周期稍长的图样,要做好等几个小时的准备。

SearchPatternLifeFind 两个函数均可设置以下的选项:

"Rule"

表示搜索的规则。目前仅支持 totalistic 或者各向同性的 non-totalistic 的 Life-like 的规则,包括六边形的规则

也可以用它来搜 Generations 规则。不过显示的结果可能会不完整,搜索范围之外可能还有“正在死亡”的细胞。也不支持搜索非周期性的图样。

规则的写法见 Golly 的帮助文件LifeWiki。注意 Golly 尚未支持 non-totalistic 的六边形的规则。

包里的一些其它函数也可以设置这一选项。

当设置 "Rule" -> "" 时,搜索的是未指定的规则。这是一个实验性的功能,速度很慢,具体见搜索图样与规则

"Symmetry"

表示搜索的对称性。支持的对称性包括 "C1","C2","C4","D2-","D2\\","D2|","D2/","D4+","D4X","D8"。对称性的前面两个字符代表图样的对称群,"Cn" 和 "Dn" 分别代表循环群二面体群; "D2" 和 "D4" 后面的符号代表图样的对称轴。

这些对称性的写法是我从 Logic Life Search 抄来的,具体的说明见这里

不支持六边形的对称性。

"Agar"

此选项默认为 False。当设为 True 时,搜索的是琼脂,而非有限的图样。也可设置为 {True, False}{False, True},使得搜索的图样在竖直或水平方向上有限,在另一个方向上则无限循环。

我还没试过在搜六边形的规则时设置这一选项,不知道会出现什么奇怪的结果。

"Changing"

此选项默认为 False,但搜索振荡子时经常会搜出静物。当设为 True 时,会只搜索变化的图样,也就是说会排除掉静物;也可设置为 {i, j},这里 ij 是两个正整数,此时搜索的是第 i 代和第 j 代不一样的图样。比如说要搜索周期为 4 的振荡子,可以设 "Changing" -> {1, 3}

在搜索周期为 1 的图样时,设置 "Changing" -> True 会搜索非空的图样。

注意设置此选项会使搜索速度变慢。

"Periodic"

此选项默认为 True,也就是说,搜索的是周期性的图样(静物、振荡子、飞船、琼脂)。如果要搜索非周期性的图样,可以把此选项设为 False。一般和 "KnownCells""OtherConditions" 配合使用。

不支持 Generations 规则。

"RandomArray"

为了保证搜出随机的结果,程序给要搜索的数组异或上了一个随机数组。如果不需要随机的结果,可以把此选项设成是 1,此时异或上的数组取成全部是 1;也可以把此选项设成是 0,此时异或上的数组取成全部是 0,不过搜索结果一般也全是 0,除非 "Changing" 设成是 True,或者设了 "KnownCells"。如果设成 0 和 1 之间的实数,这个数字会代表随机数组的密度,但这对搜索结果一般没有太大影响。

"KnownCells"

此选项用于指定已知的细胞,其值是一个三维数组,三个维度分别对应 pxy。数组中 1 代表已知的活细胞,0 代表已知的死细胞,其它的值代表未确定的细胞。这个数组可以比搜索的图样小,它会自动向右下方补齐。比如说,"KnownCells" -> {{{1, _}, {_, 0}}} 表示要搜索的图样第一代最左上方的细胞是 1,第二行第二列的细胞是 0。

"OtherConditions"

此选项用于指定需要满足的其它条件。条件中用 C[i, j, t] 来表示 (i, j) 处的细胞的第 t 代。程序会把这个条件用 Mathematica 的 BooleanConvert 函数把它化成合取范式,以方便下一步的计算,因此最好把它写成容易化成合取范式的形式。

具体的用法请见范例