人生:創造されたか進化したか?


17

正方形のGame of Lifeグリッドの状態を考慮して、それが以前の状態から進化したのか、または作成されたにすぎないのかを判断します。つまり、状態が「Garden of Eden」状態であるかどうかを識別します。

入力

1が「生きている」ことを示し、0が「死んでいる」ことを示す状態の正方形のグリッド。必要に応じて、0と1の代わりに2つの識別可能なシンボルを選択できます。

グリッドの辺の長さはゼロではありませんが、任意の自然数1 <= N <= 20です。

入力グリッド外のセルのいずれかまたはすべてがこの世代で生きている可能性があり、それらのいずれかまたはすべてが前の世代で生きている可能性があります。考慮される宇宙は無限であるため、境界条件はありません。入力のエッジは、ユニバースのエッジではありません。具体的には、グリッドはラップしません。

入力は、行で区切られた文字列または単一の文字列の形式です。必要に応じて、グリッドの辺の長さまたは領域を追加入力として(グリッドの前後に)取ることができます。

許容される入力形式:

010,101,010

010101010

010
101
010
3 010101010

出力

次世代の入力状態につながる可能性のある以前の状態(入力グリッドよりも大きい状態を含む)がない場合は「作成済み」。

次世代の入力状態につながる可能性のある少なくとも1つの可能な以前の状態(入力グリッドよりも大きい状態を含む)が存在する場合、「進化した」。

必要に応じて、「作成」と「進化」の代わりに、2つの区別可能な文字列または数字を使用できます。

可能な以前の状態は、入力と区別する必要がないことに注意してください。状態がそれ自体を次世代として持っている場合、それは進化したと見なされるべきです。

テストケース

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

作成されたテストケースは、Achim FlammenkampのGame of Lifeページから取得されます

注意

このチャレンジを書いてくれたtrichoplaxに感謝し、ここから採用しまし


6
複雑さの制限はありますか?サイズの入力の場合はm行列のn私はすべての可能なテスト場合は、2^(m*n)初期状態をプログラムの複雑さは大きくなりますが、それは結果が入力と一致した場合にだけチェックすることで問題を解決
ルイス・Mendoを

入力の@Luis?20 x20。プログラムのために?いいえ
クリストファー

2
ゴルフに飽き飽きすることはできませんが、SageMathにバンドルされている市販の整数プログラミングソルバーを使用した効率的な実装です。
-orlp

前の状態(存在する場合)がエデンの園の状態であるかどうかは関係ないと思いますか?
ハイパーニュートリノ

@Hyper nope!あなたが得るもののみ
クリストファー

回答:


3

Java- 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.