给定正方形生命游戏网格的状态,确定它是从任何先前的状态演化而来,还是只可能被创建。也就是说,标识状态是否为“伊甸园”州。
一个方格的状态,1表示“活着”,0表示“死亡”。如果您愿意,可以选择任意两个可区分的符号,而不是0和1。
网格的边长将不是零,但可能是任何自然数1 <= N <= 20。
输入网格之外的任何或所有单元可能在这一代中都是活着的,并且它们中的任何或全部在上一代中可能都是活着的。要考虑的宇宙是无限的,所以没有边界条件。输入的边缘不是宇宙的边缘。具体来说,网格没有包装。
输入可以是行分隔字符串的形式,也可以是单个字符串。如果您愿意,您可以将网格的边长或区域作为额外的输入(在网格之前或之后)。
可接受的输入格式:
010,101,010
010101010
010
101
010
3 010101010如果没有可能的先前状态(包括大于输入网格的状态)将导致下一代的输入状态,则“已创建”。
如果至少存在一种可能的先前状态(包括大于输入网格的状态),则“进化”将导致下一代的输入状态。
如果您愿意,可以使用任意两个可区分的字符串或数字来代替“创建”和“进化”。
请注意,可能的前一状态不需要与输入不同。如果一个国家有自己作为下一代,那么它应该被认为是进化的。
010
101
010 Evolved
0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created创建的测试用例取自阿奇姆·弗拉门坎普的“生命游戏”页面。
感谢trichoplax编写了这个挑战,我从这里上接受了它
发布于 2017-05-22 18:13:18
import java.util.Arrays;
public class z{
static boolean u=1>0,v=0<1;
public static void main(String[] a){
int y=a.length,x=a[0].length();Boolean[][] l=new Boolean[x][y];for(int i=0;i<a.length;i++){l[i]=m(a[i]);}
Boolean[] n=new Boolean[x*y];for(int i=0;i<n.length;i++){n[i]=v;}
while(n.length==x*y){Boolean[][] o=new Boolean[x][y];for(int i=0; i<n.length;i++){o[i%x][i/x]=n[i];}
n=p(n);o=q(o,x,y);int r=0;for(int i=0;i<x*y;i++){if(o[i%x][i/x]&&l[i%x][i/x])r++;}
if(r==x*y){System.out.println("evolved");return;}}System.out.println("created");}
public static Boolean[][] q(Boolean[][] o,int bx,int by){Boolean[][] s=new Boolean[bx][by];for(int x=0; x<bx; x++){for(int y=0;y<by;y++){
int t=0;for(int tx=-1;tx<2;tx++){for(int ty=-1;ty<2;ty++){if(ty+y<0||ty+y>by-1||tx+x<0||tx+x>bx-1)continue;if(o[tx+x][ty+y]){t++;}}}
if(t>1&&t<4){s[x][y]=u;}else{s[x][y]=v;}}}return s;}
public static Boolean[] p(Boolean[] b){boolean w=u;Boolean[] x=new Boolean[b.length];for(int i=0;i<b.length;i++){if(w&&b[i]){x[i]=u;w=u;}else if(b[i]||w){x[i]=u;w=v;}else{x[i]=v;w=v;}
}if(w){x=Arrays.copyOf(x,x.length+1);x[x.length]=u;}return x;}
public static Boolean[] m(String s){Boolean[] x=new Boolean[s.length()];for(int i=0;i<s.length();i++){x[i]=s.charAt(i)=='1';}return x;}}它通过命令行接受输入。
这里没有花招,只是一个蛮力的解决方案。它会遍历大小为X,Y的每一个可能的起始板,并通过生命游戏算法进行迭代,并根据输入板对其进行检查。这需要很长的时间,因为x×y的每个板都有2^(x*y)可能的组合。运行一个四轮驱动板花费了将近10分钟的时间。愚蠢的愚蠢的事情比它更简单。
如果它可能是一个进化的板,它打印“进化”,如果它不可能进化,它打印“创造”。
https://codegolf.stackexchange.com/questions/114289
复制相似问题