인생 : 창조 또는 진화?


17

정사각형 Game of Life 그리드의 상태를 고려하여 이전 상태에서 진화 할 수 있었는지 아니면 생성 할 수 있었는지 결정합니다. 즉, 상태가 "Eden의 정원" 상태인지 식별하십시오 .

입력

1은 "alive"를 나타내고 0은 "dead"를 나타내는 상태의 사각형 격자입니다. 원하는 경우 0과 1 대신 두 개의 구별 가능한 기호를 선택할 수 있습니다.

그리드의 측면 길이는 0이 아니지만 자연수 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

작성된 테스트 케이스는 Achim Flammenkamp의 Game of Life 페이지 에서 가져옵니다 .

노트

이 도전 과제를 작성해 주신 Trichoplax에게 감사의 말씀을 전 합니다.


6
복잡성 제한이 있습니까? size m-by- 의 입력에 n대해 가능한 모든 2^(m*n)초기 상태를 테스트 하면 프로그램의 복잡성이 커지지 만 결과가 입력과 일치하는지 확인하여 문제를 해결합니다.
Luis Mendo

입력을위한 @Luis? 이 프로그램은? 아니오
Christopher

2
나는 그것을 골라 낼 수는 없지만 SageMath에 번들로 제공되는 상용 정수 프로그래밍 솔버를 사용한 효율적인 구현 입니다.
orlp

이전 주 (존재하는 경우)가 에덴 동산 상태인지 여부는 중요하지 않다고 가정합니다.
HyperNeutrino

@ 하이퍼 당신이 얻는 것만
Christopher

답변:


3

자바-1254 바이트-매우 가난한 솔루션

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 크기의 모든 가능한 시작 보드를 거치며 Game of Life 알고리즘을 통해 한 번 반복하여 입력 보드와 비교합니다. x x y 크기의 각 보드는 2 ^ (x * y)의 가능한 조합을 갖기 때문에 매우 오랜 시간이 걸립니다. 4x5 보드를 실행하는 데 거의 10 분이 걸렸습니다. 그것보다 간단한 것을 바보처럼 바보로 만듭니다.

보드가 진화 된 보드 일 수 있으면 "진화 됨"으로 인쇄되고, 진화 할 수 없으면 "만들어진"으로 인쇄됩니다.


좋은! 나는 시간 복잡성에 대해 매우 가난하다는 것에 동의하지만, 지금까지 유일하게 (불법화되지 않은) 것이 현상금을 얻습니다! orlp가 최적화 된 것을 게시하지 않는다고 가정 :)
HyperNeutrino

2
@HyperNeutrino "당신은이 라운드에서 이겼지 만 에이스가 내 홀에 있습니다." -필립 J. 프라이
tuskiomi

축하합니다,이 솔루션은 현상금을받습니다! :)
HyperNeutrino

@HyperNeutrino 나는 그것이 영리하지 않으며 아마도 당신이 찾고있는 것이 아니라는 것을 알고 있으며, 쉽게 이길 수있는 솔루션으로 다른 솔루션에 영감을주기를 바랐지만 충분히 좋기를 바랍니다.
tuskiomi

1
또한 골프를 치지 않은 -1 (하하 그냥 농담 +1을 얻었지만 여전히 사소한 골프를 만들 수 있음);)
HyperNeutrino
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.