首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >细胞进化矩阵

细胞进化矩阵
EN

Code Golf用户
提问于 2022-01-20 07:42:00
回答 4查看 307关注 0票数 10

你的实验室需要模拟一个特定的细胞是如何在二维网格空间中随时间演化的。下面的二维网格空间样本显示网格中心有一个单元格。

代码语言:javascript
复制
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0

细胞进化遵循以下规则:

  1. '0‘表示没有活的单元格
  2. 正数表示活细胞。这个数字表示它的年龄。
  3. 细胞在每一次进化中都会从1岁增长到5岁。
  4. 5岁以后,细胞将在下一次进化中死亡(重置为'0')
  5. 如果一个细胞有四个或更多的邻居(相邻和对角线),它将因过度拥挤而死亡。
  6. 在每一次进化中,如果没有活细胞,活细胞就会扩散到它的邻居(相邻和对角线)。

规则更改

给定输入中的整数n,表示给定网格的大小,输出单元格的下一个n演化。

额外规则:

  1. 第一个活细胞总是位于网格的中心。
  2. n必须是奇数,因此活动单元总是以中心为中心。
  3. 中间1的第一个网格不算进化论。

测试用例

只需1只可节省空间

投入:3

代码语言:javascript
复制
0 0 0
0 1 0
0 0 0
代码语言:javascript
复制
1 1 1
1 2 1
1 1 1
代码语言:javascript
复制
2 0 2
0 0 0
2 0 2
代码语言:javascript
复制
3 1 3
1 1 1
3 1 3

这是密码-高尔夫,所以最短的字节获胜!

EN

回答 4

Code Golf用户

发布于 2022-01-20 18:17:05

JavaScript (ES6),222个字节

这个版本使用了注释中提到的繁琐的输出格式。

代码语言:javascript
复制
n=>(v=[...Array(n)],z=~-n/2*~n,g=m=>~n--?[m.map(r=>r.join` `).join`
`,...g(m.map((r,y)=>r.map((v,x)=>[t=0,..."1235678"].map(d=>(m[y+~-(d/3)]||0)[x+d%3-1]&&t++)|v++?v%=t>3||6:+!!t)))]:[])(v.map(_=>v.map(_=>+!z++))).join`

`

在网上试试!

如果允许标准输出(矩阵列表),则为187字节

矩阵

中心单元

给定矩阵的宽度n,我们定义:

z=\frac{(n-1)\times(-n-1)}{2}

或作为JS代码:z=~-n/2*~n

在每个访问单元之后,我们在从左到右、从上到下遍历矩阵时增加z。当z=0到达中心单元时。

例如,对于n=5,我们从z=-12开始,导致:

\begin{pmatrix}-12&-11&-10&-9&-8\\ -7&-6&-5&-4&-3\\ -2&-1&0&1&2\\ 3&4&5&6&7\\ 8&9&10&11&12\end{pmatrix}

这是--我认为--比跟踪(x,y)和在他们身上做测试更短。

票数 4
EN

Code Golf用户

发布于 2022-01-20 10:55:22

Python3.8 (预发行版),287个字节

代码语言:javascript
复制
N=int(input())
K=range(N)
G=[[+(i==j==N//2)for j in K]for i in K]
F=lambda:print('\n'.join(' '.join(str(c)for c in r)for r in G)+'\n')
F()
for _ in K:G=[[-~G[i][j]%6*(0<sum(-1<I<N and-1<J<N and G[I][J]>0for J in[j-1,j,j+1]for I in[i-1,i,i+1])<5+5*(not G[i][j]))for j in K]for i in K];F()

在网上试试!

这是一个很好的,整洁的输出方法的版本。

解释

以整数作为输入(称为N),表示网格的大小。

为其范围创建一个变量,以保存字节。(这个范围被使用了好几次。)

通过在中间放置1(行和列为N//2)和在所有其他位置设置0来设置网格。

创建一个打印网格的函数。

打印网格。

通过将i,j处的元素更改为-~G[i][j]%6 (1+现有的元素,模6:模6确保5变为6%6 = 0),将网格N倍改为它的邻域中至少有一个活元素(包括它自己);如果该区域中没有活元素,它就无法存活),如果该元素本身是活动的(这是杀死过度拥挤元素的部分),则最多有5个活元素;如果该元素已经死亡,则最多有10个活元素(不管这个元素有多拥挤,因为如果它周围至少有一个活元素,而它本身不是死的,那么它就会活着)。如果不满足这些条件,则将其设置为零。然后在每次迭代时打印网格。

“第一个网格不是进化”

Python3.8 (预发行版),270个字节

代码语言:javascript
复制
N=int(input())
K=range(N)
G=[[+(i==j==N//2)for j in K]for i in K]
for _ in K:G=[[-~G[i][j]%6*(0<sum(-1<I<N and-1<J<N and G[I][J]>0for J in[j-1,j,j+1]for I in[i-1,i,i+1])<5+5*(not G[i][j]))for j in K]for i in K];print('\n'.join(' '.join(str(c)for c in r)for r in G)+'\n')

在网上试试!

目前,我不确定第一个网格是否是一个进化,但以防万一,我提供了这两个版本。(第一个网格不是进化的声明与测试用例输出相冲突。)

票数 2
EN

Code Golf用户

发布于 2022-01-21 09:57:40

J,62字节

代码语言:javascript
复制
<@>:_&(](-~&*+(5>])*[+0<[)[:+/(>,{;~i:1)|.!.0*@])[:*/~<.@-:=i.

在网上试试!

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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