你的实验室需要模拟一个特定的细胞是如何在二维网格空间中随时间演化的。下面的二维网格空间样本显示网格中心有一个单元格。
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细胞进化遵循以下规则:
给定输入中的整数n,表示给定网格的大小,输出单元格的下一个n演化。
额外规则:
n必须是奇数,因此活动单元总是以中心为中心。只需1只可节省空间
投入:3
0 0 0
0 1 0
0 0 01 1 1
1 2 1
1 1 12 0 2
0 0 0
2 0 23 1 3
1 1 1
3 1 3这是密码-高尔夫,所以最短的字节获胜!
发布于 2022-01-20 18:17:05
这个版本使用了注释中提到的繁琐的输出格式。
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,我们定义:
或作为JS代码:z=~-n/2*~n
在每个访问单元之后,我们在从左到右、从上到下遍历矩阵时增加z。当z=0到达中心单元时。
例如,对于n=5,我们从z=-12开始,导致:
这是--我认为--比跟踪(x,y)和在他们身上做测试更短。
发布于 2022-01-20 10:55:22
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个活元素(不管这个元素有多拥挤,因为如果它周围至少有一个活元素,而它本身不是死的,那么它就会活着)。如果不满足这些条件,则将其设置为零。然后在每次迭代时打印网格。
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')目前,我不确定第一个网格是否是一个进化,但以防万一,我提供了这两个版本。(第一个网格不是进化的声明与测试用例输出相冲突。)
发布于 2022-01-21 09:57:40
https://codegolf.stackexchange.com/questions/241434
复制相似问题