首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生命最短博弈

生命最短博弈
EN

Code Golf用户
提问于 2011-08-13 22:37:27
回答 22查看 22.8K关注 0票数 79

康威的生命游戏是蜂窝自动化的典型例子。这些细胞形成一个方形网格,每个细胞都有两种状态:活的或死的。在每一次轮转中,每个单元都会根据其及其八个邻居的状态同时更新:

  • 一个活的细胞如果有两个或三个活的邻居,它仍然活着。
  • 如果一个死细胞有三个活的邻居,它就会活下来。

如果你选择接受的话,你的任务就是用你最喜欢的语言来编码最短的生命游戏实现。

规则:

  • 网格必须至少为20x20。
  • 网格必须环绕(因此网格就像一个圆柱体的表面)
  • 您的实现必须允许用户输入他们自己的启动模式。
  • 如果您看不到正在发生的事情,GoL就有点毫无意义,因此必须有运行自动机的可视化输出,每个回合的结果显示的时间足够长,可以看到!
EN

回答 22

Code Golf用户

发布于 2011-08-23 04:32:15

Python,219个字符

我追求的是最大的黄金,有足够的界面来满足这个问题。

代码语言:javascript
复制
import time
P=input()
N=range(20)
while 1:
 for i in N:print''.join(' *'[i*20+j in P]for j in N)
 time.sleep(.1);Q=[(p+d)%400 for d in(-21,-20,-19,-1,1,19,20,21)for p in P];P=set(p for p in Q if 2-(p in P)<Q.count(p)<4)

你就这样运行它:

代码语言:javascript
复制
echo "[8,29,47,48,49]" | ./life.py

列表中的数字表示起始单元格的坐标。第一行是0-19,第二行是20-39,等等。

在一个有21行的终端上运行它,它看起来很时髦。

票数 37
EN

Code Golf用户

发布于 2015-06-21 17:57:36

TI-BASIC,96个字节(87个用于非竞争条目)

为您的TI-84系列图形计算器(!)。这是一个相当大的挑战,因为编写缓冲的图形例程(绝对不是内置的)是不容易的,而图形屏幕只有四个相关的图形命令:Pxl-On()Pxl-Off()Pxl-Change()pxl-Test()

使用屏幕上的每个可访问像素,并正确包装。每个单元格是一个像素,程序在屏幕的右侧水平地逐行更新。由于计算器只有一个15 the的z80处理器,而且BASIC是一种缓慢的解释语言,所以代码每5分钟只得到一帧。

用户输入很简单:在运行程序之前,使用Pen工具在图形屏幕上绘制您的形状。

从我进入代码高尔夫竞赛在计算器论坛Omnimaga后改编而成。

代码语言:javascript
复制
0
While 1
For(X,0,94
Ans/7+49seq(pxl-Test(remainder(Y,63),remainder(X+1,95)),Y,62,123
For(Y,0,62
If 1=pxl-Test(Y,X)+int(3fPart(3cosh(fPart(6ֿ¹iPart(sum(Ans,Y+1,Y+3
Pxl-Change(Y,X
End
End
End

Omnimaga版本(87个字节)

这段代码还有一个额外的特性:它检测它是否第一次运行,以及是否将屏幕状态随机化。在随后的运行中,如果在帧完成后停止,它将自动继续进行模拟。但是,它不是一个竞争条目,因为它没有包装屏幕;如果事先清除图形屏幕,外部边框上的单元格将始终被视为死掉。

代码语言:javascript
复制
0
While 1
For(X,0,93
Ans/7+49seq(pxl-Test(Y,X+1),Y,0,62
For(Y,1,61
If 2rand>isClockOn=pxl-Test(Y,X)+int(3fPart(3cosh(fPart(6ֿ¹iPart(sum(Ans,Y,Y+2
Pxl-Change(Y,X
End
End
ClockOff
End

这个版本可能是我编写过的最高级的代码,包含了一些真正令人讨厌的模糊优化:

  • 我用时钟状态作为标志。在程序开始时,启用了日期/时间时钟,我使用全局isClockOn标志的值来确定它是否是第一次迭代。第一帧画好后,我就把钟关了。在最短的其他方法上节省一个字节,比明显的方法节省大约四个字节。
  • 我将三列的状态存储在一个63元素的基-7数字数组中。49's的地方是右边的柱子,7's的地方是中间的,单位的地方是左的-1代表活的细胞,0的是死的细胞。然后,我取单元周围三个数字之和的剩余mod 6,以求活邻居单元的总数(这就像9技巧的可分性--在基7中,剩余的mod 6等于数字之和)。单独保存大约10个字节,并提供使用下两个优化的机会。示例图(假设在Y=45的某一列有一个滑翔机中心:行# certain +存储号_ Mod 6=单元格数. 44 Live,Live 49+7+1 = 57 3 45 Dead,Dead,Live 49+0+0 = 49 1 46 Dead,Live,Dead 0+7+0 =7.中心细胞会死掉,因为它周围有五个活细胞。
  • 在完成每一行之后,通过将现有数字除以7,丢弃十进制部分,并将新列中单元格的值添加49倍来更新数组中的数字。每次存储所有三列都要慢得多,而且不那么优雅,至少需要20个字节,并且使用三个列表而不是一个列表,因为在更新单元格之前必须存储每行单元格的值。这是迄今为止最小的存储单元格位置的方法。
  • 当输入等于3/6时,代码片段int(3fPart(3cosh(给出1,当输入等于4/6时给出2,当输入等于0、1/6、2/6或5/6时给出0。节省约6个字节。
票数 27
EN

Code Golf用户

发布于 2020-05-03 18:37:23

x86汇编程序,MSDOS,32字节

代码语言:javascript
复制
0xC5 0x24 0x20 0xB3 0x07 0x08 0x04 0xA7 0xC0 0x2D 0x05 0x91 0x02 0x41 0x5E 0x02
0x40 0xFC 0x02 0x80 0x9C 0x00 0x4B 0x75 0xF2 0x8A 0x04 0xF9 0xD2 0xD8 0xEB 0xE1

此代码用x86汇编程序编写,并在MSDOS中工作。二进制文件的大小为32个字节。你可以找到一个非常详细的描述。可见光场为80x25。输出以文本模式直接显示在屏幕上,文本模式也用作输入,因此您可以在启动程序之前输入模式。您可以下载和评论介绍,也可以测试在线版本

代码语言:javascript
复制
lds sp,[si]
X: db 32
mov bl,7                    ; O: 3 iterations
or [si],al                  ; O: Add in new cell
cmpsw
shr byte [di],5             ; O: Shift previous value 
C: xchg cx,ax
add al,[di+bx+94]           ; O: Add in this column
add al,[si+bx-4]
add al,[si+bx+156]
dec bx                      ; O: Loop back
jnz C
mov al,[si]                 ; O: 3 = birth, 4 = stay (tricky): 
stc                         ; O: 1.00?0000x --> 0.0x100?00 (rcr 3) 
rcr al,cl                   ; O:          +---> 0.00x100?0 (rcr 4) 
jmp short X-1
票数 24
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/3434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档