在3D中实现生活游戏


17

面临的挑战是找到最短的3D生活游戏实施方式(示例)。这些是规则:

只有1个或更少邻居的像元(在这种情况下为立方体)会死亡,就像是出于孤独一样。
如果恰好有5个细胞围绕一个空细胞,则它们会繁殖并充满它。
如果一个小区有8个或更多的邻居,它将死于拥挤。

至少将其设置为10x10x10,这样才能分别输出图层:

0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 X 0 0 X 0 0 0 0 0
0 0 X X X 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

当然,也可以接受图形3D模拟
。起始位置可能是硬编码的,但是如果将其更改为任何起始位置,则它必须起作用。它必须能够计算任何数量的世代,并且用户必须能够手动请求下一代。

以字符中最短的代码为准

我针对任何(多维数据集)大小都对此进行了自己的实现:http : //jensrenders.site88.net/life3D.htm 您可以使用它进行测试,并且可以将代码基于我的,尽管我没有对此发表评论。 。


1
从您的语句隐含的代码高尔夫标记中找到最短的实现。请检查它是否是您想要的。您还应该提供一些有关如何输入,多少个周期,动画是/否的详细信息,因为对于代码高尔夫来说,拥有一个可靠的规范至关重要。
霍华德

@Howard我添加了更多规范,是的,忘记了代码高尔夫标签;)谢谢。
Jens Renders 2014年

@PeterTaylor是的,确切的是5,我将对其进行编辑。
Jens Renders

我要添加有关输出格式的细节(例如,如您的示例中的每个单元格必须用空格隔开,输出的每个网格层之间的换行符,活动单元格和无效单元格必须用不同的字符表示,并且这些字符必须是可见字符。)另外,请记住,如果将其构造为代码高尔夫球,则不太可能获得图形模拟。
乔纳森·范·马特雷

您是否真的要禁止所有漏洞 在该meta线程中讨论,还是仅那些符合(不批准)标准的(+5分,至少是赞成票的两倍)?因为我敢肯定,我完全可以想到一些非常有趣的“漏洞”来讨论... ;-)
Ilmari Karonen 2014年

Answers:


14

Mathematica-120个字节

g=CellularAutomaton[{(l=Flatten@#;c=l[[14]];n=Total@Drop[l,{14}];Which[n<2||n>7,0,n==5||c==1,1,0<1,0])&,{},{1,1,1}},##]&

当然不是赢家的竞争者,但这不是我的意图。同样,仅通过弄清楚规则编号,就可以大大降低成本。我只是想写一个可视化文件(尽管我确实确定那里已经有很多东西了)。所以我们开始):

animateGol3d[size_, i_, n_] := 
  ListAnimate[
    Graphics3D[
      Cuboid /@ Position[#, 1], 
      PlotRange -> {{0, size}, {0, size}, {0, size}} + 1
    ] & /@ g[i, n]
  ];

在尝试了许多初始条件之后,我得到了类似以下内容:

在此处输入图片说明

这是一个网格大小为 20x20x20。这花了几秒钟来模拟和渲染:

在此处输入图片说明

顺便说一下,这假设周期性边界条件。


那些真的进入了平衡状态,还是只是动画停止了?如果是前者,您给了我一些巧妙的想法...
Kroltan

1
@Kroltan已经有一段时间了,但是我很确定他们已经达到了平衡。
Martin Ender 2014年

1
很好,谢谢。可以说,均衡的各个部分看起来非常像空间图,就像是胭脂般的游戏。
Kroltan

12

APL,46

我花了一些时间,但我将其减少到46个字符:

{(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵}

该函数采用任意大小的布尔3D矩阵,并根据给定的规则计算下一代。没有指定边界条件,因此我选择环绕另一侧,例如在环形空间中。

说明

{                           ⊂⍵}   Take the argument matrix and enclose it in a scalar
               (i←2-⍳3)           Prepare an array with values -1 0 1 and call it i
                       ⌽[2]¨      Shift the matrix along the 2nd dim. by each of -1 0 1
           i∘.⊖                   Then for each result do the same along the 1st dimension
       i∘.⌽                       And for each result again along the 3rd dimension
 m←⊃+/,                           Sum element-wise all 27 shifted matrices and call it m

中间结果m是一个形状与原始矩阵相同的矩阵,该矩阵为每个元素计算在其3×3×3邻域(包括其自身)中有多少个细胞存活。然后:

           |5.5-m   For each element (x) in m, take its distance from 5.5
       ⍵∧3>         If that distance is <3 (which means 3≤x≤8) and the original cell was 1,
 (5=m)∨             or if the element of m is 5, then the next generation cell will be 1.

定义一个随机的4×4×4矩阵,其中约有1/3个单元= 1,并计算其第一代和第二代。该⊂[2 3]在前面仅仅是打印面水平,而不是垂直一招:

      ⊂[2 3] m←1=?4 4 4⍴3
 1 0 0 0  1 0 1 0  1 0 1 0  0 0 0 1 
 1 1 0 0  0 0 0 0  0 0 0 1  1 0 1 0 
 0 0 0 0  0 1 0 0  0 0 0 0  0 0 1 0 
 1 1 0 0  0 0 0 1  1 0 0 1  0 0 1 0 
      ⊂[2 3] {(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵} m
 0 0 0 0  0 0 1 0  1 0 1 0  0 0 0 0 
 1 0 0 0  0 0 1 0  0 0 0 0  1 0 1 0 
 0 0 0 0  0 1 0 0  0 0 0 0  0 0 1 0 
 1 1 0 0  0 0 0 0  1 0 0 0  0 0 1 0 
      ⊂[2 3] {(5=m)∨⍵∧3>|5.5-m←⊃+/,i∘.⌽i∘.⊖(i←2-⍳3)⌽[2]¨⊂⍵}⍣2⊢ m
 0 0 1 0  1 0 1 0  1 0 1 0  0 0 0 0 
 1 0 1 0  0 0 1 1  0 0 0 0  1 0 1 0 
 1 0 0 0  1 1 0 0  0 0 1 0  1 0 1 0 
 1 1 1 0  1 0 0 1  1 0 1 0  0 0 1 0 

+1非常好的答案!实际上,没有指定边界,因此允许环绕。
Jens Renders

9

J-42个字符

我们假设在所有三个维度上都具有环形板(环绕)。J的结果自动显示似乎遵循输出规范,1用于活细胞和0死细胞。此代码可在任何宽度,长度和高度(可以是10x10x10、4x5x6等)上使用。

(((1&<*<&8)@-*]+.5=-)~[:+/(,{3#<i:1)|.&><)

解释如下:

  • ,{3#<i:1 -单元及其所有邻居的偏移量列表的子表达式。
    • <i:1 -1到-1之间的整数列表。
    • ,{3#-复制该列表的三份(3#),并获取笛卡尔积(,{)。
  • (,{3#<i:1)|.&><-对于每组3D偏移,移动阵列。在3个字符的成本,你可以改变|.&>|.!.0&>不具有环绕。
  • [:+/ -将所有移位的板加在一起。
  • ((1&<*<&8)@-*]+.5=-)~-较长的外部动词是一个钩子,因此我们一直在左右移动并求和,从而接收左右两侧的木板。的~掉期这个围绕该内部动词。
    • 5=- -在每个单元格中,偏移后的板之和减去原始板(即邻居计数)等于5,其他所有块等于0。
    • ]+. -逻辑或与原板相同。
    • (1&<*<&8) -如果将1到8之间的数字进行比较,则为1;否则为0。
    • (1&<*<&8)@-* -比较(如上所述)邻居计数,并以此乘以(即,当域仅为1或0时的逻辑与)。

用法与APL相同,只需将功能应用于每个步骤的初始电路板即可。J有一个功能强大的运算符^:来简化这一过程。

   life =: (((1&<*<&8)@-*]+.5=-)~[:+/(,{3#<i:1)|.&><)  NB. for convenience
   board =: 1 = ?. 4 4 4 $ 4  NB. "random" 4x4x4 board with approx 1/4 ones
   <"2 board  NB. we box each 2D plane for easier viewing
+-------+-------+-------+-------+
|0 0 0 0|1 1 0 0|0 1 0 0|0 0 1 0|
|0 1 0 0|0 0 0 0|0 0 0 1|1 0 0 0|
|0 0 0 0|0 0 1 0|0 1 0 0|0 0 0 1|
|1 1 0 0|1 0 0 0|0 0 0 1|0 1 1 0|
+-------+-------+-------+-------+
   <"2 life board
+-------+-------+-------+-------+
|0 0 0 0|0 1 0 1|0 1 0 0|0 0 1 0|
|1 1 1 1|0 0 0 0|0 0 0 1|1 1 0 0|
|0 0 0 0|0 0 1 1|0 1 0 0|0 0 0 1|
|1 0 0 0|1 0 0 1|0 0 0 1|0 1 1 1|
+-------+-------+-------+-------+
   <"2 life^:2 board  NB. two steps
+-------+-------+-------+-------+
|0 0 0 0|0 1 0 0|0 1 0 0|0 0 0 0|
|0 1 0 0|0 0 0 0|0 0 0 1|0 1 0 0|
|0 0 0 0|0 0 0 0|0 1 0 0|0 0 0 0|
|0 0 0 0|0 0 0 1|0 0 0 0|0 1 1 1|
+-------+-------+-------+-------+
   <"2 life^:3 board  NB. etc
+-------+-------+-------+-------+
|0 1 0 0|1 1 1 0|0 1 0 0|0 1 0 0|
|0 1 0 0|1 0 1 0|1 0 1 0|1 1 1 0|
|1 0 0 0|0 0 0 0|0 1 0 0|0 1 0 0|
|0 0 1 0|0 0 0 0|0 1 0 0|0 1 1 0|
+-------+-------+-------+-------+

我之所以说“随机”,是因为?.原语每次都使用固定种子来提供可重现的随机结果。?是真正的RNG。


诅咒J及其犯规|.动词!做得好。
Tobia 2014年
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.