看似同一条邻居规则,若一边计算一边覆盖旧格子,后面的格子可能读到本轮新值。用两份状态分别读写,可以明确表达所有格子使用上一轮数据的规则。
以下是一组可按记录复查的虚构游戏例子。它先固定输入、单位和执行顺序,再展示每一步结果。读者可以用纸笔挑出几步核对,不需要依赖具体游戏的后台数据。
明确规则与输入
九个二值格子,边界外固定为零。每轮新值等于左邻与右邻是否不同。同步模式全部读取旧行;原地模式从左到右写回,因此左邻可能已经更新,而右邻仍是旧值。两种模式独立推进十轮。
初始九格从编号零到八为[1, 0, 1, 0, 1, 0, 1, 1, 0],边界外固定为零
完整计算过程
第1轮同步读取旧行[1, 0, 1, 0, 1, 0, 1, 1, 0],得到[0, 0, 0, 0, 0, 0, 1, 1, 1];同轮原地扫描结果[0, 1, 1, 0, 0, 1, 0, 0, 0],不同格编号[1, 2, 5, 6, 7, 8]。原地模式后续轮次从自己的上一轮结果继续。
第2轮同步读取旧行[0, 0, 0, 0, 0, 0, 1, 1, 1],得到[0, 0, 0, 0, 0, 1, 1, 0, 1];同轮原地扫描结果[1, 0, 0, 0, 1, 1, 1, 1, 1],不同格编号[0, 4, 7]。原地模式后续轮次从自己的上一轮结果继续。
第3轮同步读取旧行[0, 0, 0, 0, 0, 1, 1, 0, 1],得到[0, 0, 0, 0, 1, 1, 1, 0, 0];同轮原地扫描结果[0, 0, 0, 1, 0, 1, 0, 1, 1],不同格编号[3, 4, 6, 7, 8]。原地模式后续轮次从自己的上一轮结果继续。
第4轮同步读取旧行[0, 0, 0, 0, 1, 1, 1, 0, 0],得到[0, 0, 0, 1, 1, 0, 1, 1, 0];同轮原地扫描结果[0, 0, 1, 1, 0, 0, 1, 0, 0],不同格编号[2, 4, 7]。原地模式后续轮次从自己的上一轮结果继续。
第5轮同步读取旧行[0, 0, 0, 1, 1, 0, 1, 1, 0],得到[0, 0, 1, 1, 1, 0, 1, 1, 1];同轮原地扫描结果[0, 1, 0, 0, 0, 1, 1, 1, 1],不同格编号[1, 2, 3, 4, 5]。原地模式后续轮次从自己的上一轮结果继续。
第6轮同步读取旧行[0, 0, 1, 1, 1, 0, 1, 1, 1],得到[0, 1, 1, 0, 1, 0, 1, 0, 1];同轮原地扫描结果[1, 1, 1, 1, 0, 1, 0, 1, 1],不同格编号[0, 3, 4, 5, 6, 7]。原地模式后续轮次从自己的上一轮结果继续。
第7轮同步读取旧行[0, 1, 1, 0, 1, 0, 1, 0, 1],得到[1, 1, 1, 0, 0, 0, 0, 0, 0];同轮原地扫描结果[1, 0, 1, 1, 0, 0, 1, 0, 0],不同格编号[1, 3, 6]。原地模式后续轮次从自己的上一轮结果继续。
第8轮同步读取旧行[1, 1, 1, 0, 0, 0, 0, 0, 0],得到[1, 0, 1, 1, 0, 0, 0, 0, 0];同轮原地扫描结果[0, 1, 0, 0, 0, 1, 1, 1, 1],不同格编号[0, 1, 2, 3, 5, 6, 7, 8]。原地模式后续轮次从自己的上一轮结果继续。
第9轮同步读取旧行[1, 0, 1, 1, 0, 0, 0, 0, 0],得到[0, 0, 1, 1, 1, 0, 0, 0, 0];同轮原地扫描结果[1, 1, 1, 1, 0, 1, 0, 1, 1],不同格编号[0, 1, 4, 5, 7, 8]。原地模式后续轮次从自己的上一轮结果继续。
第10轮同步读取旧行[0, 0, 1, 1, 1, 0, 0, 0, 0],得到[0, 1, 1, 0, 1, 1, 0, 0, 0];同轮原地扫描结果[1, 0, 1, 1, 0, 0, 1, 0, 0],不同格编号[0, 1, 3, 4, 5, 6]。原地模式后续轮次从自己的上一轮结果继续。
完整过程保留每一轮结果,可检查第一次偏差产生在哪个格子,不能仅用某一轮偶然相同来判断两种实现等价。
独立核对与边界
同步模式可以把整行编码成二进制位串,将左移与右移结果按位异或,再去掉超出九位的部分。原地模式第几个输出等于旧行从第二格到其右邻的前缀异或,可独立核对扫描结果。
这是一条虚构二值演化规则,不代表真实生命模拟或物理扩散。原地更新不是在所有任务里都错误,它只是实现了不同的时间依赖。若设计要求同时读取旧状态,就必须避免后面的计算混入新值。
练习时只改变一个条件,先判断哪些中间步骤应当受影响,再重新计算。要把空状态、数值零和未能确定的结果分开。边界约定不同可能产生不同答案,复查的目标是确认输入、过程与规则一致,而不是只追求最后一个数字看起来相同。
