Questions tagged «cellular-automata»

涉及细胞自动机的难题,例如Conway的《人生游戏》。

5
模拟任何一维元胞自动机
挑战 您将要编写一个完整的程序,该程序使用来自STDIN的七个数字,并将元胞自动机(CA)的二维历史记录打印到STDOUT。这是代码高尔夫。 输入格式 输入将是七个整数/字符串,以逗号分隔。第一个数字是根据Wolfram代码的规则编号(每个规则的标准名称)。第二个是初始启动配置。第三个和第四个描述了什么模式以及应将多少模式附加到启动配置的左侧。作为填充。第五和第六在右侧也是如此。最后一个数字是运行模拟的世代数。 因此,输入示例为90,11,0,4,0,4,5。这应该告诉您的程序您正在运行规则90。它还应该告诉程序您希望初始配置是11在字符串的0两端都附加4次,因此实际的开始模式是0000110000。它还告诉您的程序将此模拟运行5代。 输出您的程序应该打印每一代的整个单元格数组(用换行符分隔),以便输出是CA的时空图。对于每一代,根据作为输入提供的规则,每个单元的状态由其状态和紧靠左侧和右侧的单元的状态确定。模拟应围绕边缘。首先打印的应该是gen的起始数组。0。 输入90,11,0,4,0,4,5应尽可能精确地产生以下输出。 0000110000 0001111000 0011001100 0111111110 1100000011 0110000110 请注意,起始状态不包括在五代中。还要注意,模拟环绕着边缘。 更多例子 输入: 184,1100,01,2,01,1,4 输出: 0101110001 1011101000 0111010100 0110101010 0101010101 输入: 0,1011,1,0,0,1,2 输出: 10110 00000 00000 有关一维CA如何工作以及如何编号的更多信息

6
二进制自转
给定一个二进制3D数组,对于每一层,按其上一层的各列的二进制编码所示,将其每一列循环向上旋转许多步,然后按如下所示将其每一行循环左旋转许多步下方图层的行的二进制编码。 总会有至少三层。顶层的列和底层的行不应旋转。 演练 让我们从小的4层2行3列数组开始: [[[1,0,1], [1,0,0]], [[1,0,1], [0,1,1]], [[0,1,1], [1,1,1]], [[1,1,0], [1,1,1]]] 第一步是评估每一层的列和行以二进制编码的数字: 3 0 2 5 [[[1,0,1], 4 [1,0,0]], 2 1 3 5 [[1,0,1], 3 [0,1,1]], 1 3 3 3 [[0,1,1], 7 [1,1,1]], 3 3 1 6 [[1,1,0], 7 [1,1,1]]] 第一层[[1,0,1],[1,0,0]]不会旋转其列,但其行将分别向左循环5步和3步,从而变为[[1,1,0],[1,0,0]]。 第二层[[1,0,1],[0,1,1]]的列将分别循环向上旋转3、0和2步,给出[[0,0,1],[1,1,1]],然后将行分别向左循环旋转3和7步,没有可见变化。向上旋转2、1、3步 的第三层[[0,1,1],[1,1,1]]保持不变,向左旋转6、7步也没有任何作用。 最后,[[1,1,0],[1,1,1]]向上旋转了1、3和3步的第四层是[[1,1,1],[1,1,0]],但是之后的行不再旋转,因为它是最后一层。 再次将所有图层放在一起,便得到了二进制自旋转3D数组: [[[1,1,0], [1,0,0]], [[0,0,1], [1,1,1]], …

6
翻倒沙堆
(存在有关无限沙堆以及查找沙堆的标识元素的相关问题。) 给定非负整数矩阵,返回尺寸相同但倒塌的矩阵: 如果矩阵不包含任何大于4的值,则将其返回。 每个大于3的“单元”都会减少4,并且所有直接相邻的单元(上方,下方,左侧和右侧)(如果存在)都会递增。 转到1。 例子: 0 1 0 0 2 0 2 4 0 -> 3 0 1 0 0 3 0 1 3 1 2 3 2 3 4 2 5 1 4 1 2 0 3 3 0 3 3 0 3 3 4 5 6 -> …

11
模拟一维生活游戏模型
这个问题只是在代码审查中引起的,我认为您可能希望将其改编为代码高尔夫挑战: 系统会为您提供x个以布尔值表示的房屋的非空列表。每天,房屋与相邻房屋竞争。1代表“活动”房屋,0代表“无效”房屋。如果给定房屋两侧的邻居都处于活动状态或都处于非活动状态,则该房屋在第二天变为非活动状态。否则它将变为活动状态。 def get_state_as_pos(thelist, pos): if thelist[pos-1] == thelist[pos+1]: return 0 else: return 1 例如,如果我们有一组邻居[0,1,0],则[1]处的房屋将变为0,因为左侧和右侧的房屋均处于非活动状态。两端的单元格也检查相对侧,因此索引0的邻居位于索引length-1和索引n1,反之亦然。即使更新了单元之后,在更新其他单元时也必须考虑其先前状态,以便每个单元的状态信息同时更新。 该函数采用状态数组和多个步骤,并应在给定数量的步骤之后输出房屋的状态。 input: states = [1, 0, 0, 0, 0, 1, 0, 0], steps = 1 output should be [0, 1, 0, 0, 1, 0, 1, 1] input: states = [1, 1, 1, 0, 1, 1, …

2
帕特森高尔夫蠕虫
帕特森蠕虫是一种细胞自动机,存在于无限的三角形网格中,每走一步,它们就会朝某个方向旋转并移动一个单位。它们的定义特性是,它们永远不会两次经过相同的地点,并且每当遇到相同的环境时,他们都会做出相同的决定。蠕虫总是从自己的角度“看到”,其尾巴位于3处,其头部位于此六角形的中心: 例如,考虑使用以下规则的蠕虫: 如果0、1、2、4和5都为空,则沿方向2移动 如果0、1、4和5为空白,并且填充了2,则沿方向0移动 如果0、1和5为空白,而2和4已填充,则沿方向0移动 这将导致以下路径(来自Wikipedia): 如果蠕虫发现自己处于周围所有环境都被淹没的状态,它将终止。 输入值 数字列表。第n个数字表示蠕虫应在必须做出决定的第n个新情况下做出什么决定。请注意,如果除了一个周围的环境外,其他所有空间都被填充,则它必须沿唯一的空白方向移动。这不算作“决定”,也不消耗数字。要生成上面显示的示例蠕虫,输入为[2, 0, 0]。确保输入产生蠕虫,该蠕虫会终止并且不会回溯其路径,并且输入永远不会太短。 输出量 从处开始输出坐标列表,以指示蠕虫头所在的位置(1, 0)。我们将考虑向上和向右移动仅是y值的减小,而向上和向左移动则是x值的减小和y值的减小。例如,示例输入的路径输出为 (1, 0), (1, 1), (0, 0), (-1, -1), (0, -1), (0, 0), (0, 1), (-1, 0), (0, 0) 测试用例 您也可以使用javascript代码段运行测试。 [2,0,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(0,1),(-1,0),(0,0) [1,0,4,0,1,5]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,1),(4,2),(4,3),(3,3),(2,2),(1,1),(1,0),(2,0),(3,1),(3,0),(4,0),(5,1),(5,2),(4,2),(3,2),(2,1),(1,1),(0,0),(-1,0),(-2,-1),(-2,-2),(-1,-2),(0,-1),(1,0),(1,-1),(2,-1),(3,0),(4,1),(4,2),(5,3),(5,4),(4,4),(3,3),(3,4),(2,4),(1,3),(1,2),(1,1),(0,1),(-1,0),(-1,1),(-2,1),(-3,0),(-3,-1),(-2,-1),(-1,-1),(0,0) [1,0,5,1]: (1,0),(2,1),(2,2),(1,2),(0,1),(0,0),(0,-1),(1,-1),(2,0),(2,1),(3,2),(3,3),(2,3),(1,2),(0,2),(-1,1),(-1,0),(0,0),(1,1),(1,2),(1,3),(0,3),(-1,2),(-1,1),(-2,0),(-2,-1),(-1,-1),(0,0) [2,0,1,0]: (1,0),(1,1),(0,0),(-1,-1),(0,-1),(0,0),(-1,0),(-1,-1),(-1,-2),(0,-1),(1,0),(2,1),(1,1),(0,1),(0,0) 以下匆忙组装的(可能是越野车)程序将显示蠕虫: 显示代码段 var canvas = document.querySelector("canvas"); var ctx …

9
实现一个奇怪的自动机
我在玩蜂窝自动机,发现其中的一种有趣的行为。运作方式如下: 它从左到右读取一个二进制字符串,如果遇到一个1后跟2其他值的二进制字符串,它将0在结果后面追加一个并继续读取。如果遇到a 0(或剩余少于3个值),它将附加当前值和a 1并继续读取。在字符串的末尾,它将1在结果后附加一个。 这是一代人的例子 01011111 ^ 我们首先遇到a,0因此我们将其追加01到结果中 01011111 ^ 01 现在我们遇到一个,1所以我们附加一个零并跳过接下来的两个值 01011111 ^ 010 我们遇到另一个,1所以我们也一样 01011111 ^ 0100 现在,我们还有另一个1但没有足够的空间可以跳转,因此我们附加了当前单元格和一个1(在这种情况下11) 01011111 ^ 010011 我们已经结束了,所以我们追加一个1并终止这一代 01011111 ^ 0100111 任务 给定任何合理格式的输入,您必须创建一个计算一代自动机的函数或程序。 这是一个代码问题,因此答案将以字节计分,而字节越少越好。 实施范例 这是Haskell中的示例实现(定义了一个函数d,但是程序无限期地打印迭代): d('1':_:_:x) = "0" ++ d x d(a:x) = a:'1':d x d x = "1" r x = x:map …

4
生活与疲劳的游戏
Stewie的《生命与疲劳游戏》与更著名的Conway的《生命游戏》非常相似。 Stewie的“生命与疲劳游戏”(GoLF)的宇宙是一个由正方形单元组成的无限二维正交网格,每个网格都处于三种可能的状态之一,即活着,死亡或疲倦。每个单元都与其八个相邻的单元进行交互,这八个单元是水平,垂直或对角线相邻的单元。在每个时间步上,都会发生以下转换: 任何具有少于两个活邻居的活细胞都会死亡,好像是由于人口不足造成的。 任何有两个或三个活邻居的活细胞都可以存活到下一代。 任何具有三个以上活邻居的活细胞都会死亡,就好像人口过多一样。 具有正好三个活邻居的任何死细胞都将变成活细胞,就像通过繁殖一样。 连续存活了两个世代的任何细胞都会死亡,好像是由于疲劳而死亡。直到下一代,它才能重生 输入网格边界之外的任何像元都将消失,就像从悬崖上掉下来一样。 挑战: 您面临的挑战是获取一个代表GoLF初始状态的n×m尺寸的网格和一个整数p,并在p代之后输出游戏的状态。 规则: 输入和输出格式是可选的,但输入/输出网格应具有相同的表示形式 您可以选择任何可打印的符号来表示活细胞和死细胞(我将1用于活细胞和0死细胞)。 您可以选择索引为0还是1。在示例中,p=1是指一步之后的状态。 每种语言中最短的代码获胜 允许用于蜂窝自动化的内置功能 测试用例: 在示例中,我仅在输入中包含输入网格,而不是p。我提供了各种p值的输出。您只能输出与给定输入p一起的网格。 Input: 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 --- Output --- p = 1 …

3
识别细胞自动机的序列
背景 出于这一挑战的目的,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是通过重复应用获得列表的列表f来L,并收集在一个列表中的结果。最终列表具有长度为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 = 2,M = [[0,1],[1,0]]以及L = [1,0,1,1]。矩阵M定义了二进制XOR自动机f(a,b) = a+b mod 2,并且时空图从Lis 开始 …

2
税务史学家
介绍 有一个收税员在管理其王国的税收时遇到了一些麻烦:历史记录已在大火中燃烧。 他想找出从现有资金继承的角度来看可能有多少过去。幸运的是,他的王国很简单。 王国可以用2D布尔矩阵建模,其中l代表已继承货币的O人,而未继承货币的人。例如: l O l l O O O l l O l O O O O l (它将始终是一个矩形) 在下一代中,王国变小了(狼很强!)。 下一代看起来像这样,叠加在上一代上(x是下一代后代的占位符) l O l l x x x O O O l x x x l O l O x x x O O O l 后代将着眼于那些直接身边的祖先(所以左上角x会看到{ l,O,O,O},称为未对齐的矩形街区) …
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.