Leben: Erstellt oder entwickelt?


17

Bestimmen Sie anhand des Zustands eines quadratischen Gitters von Game of Life, ob es aus einem früheren Zustand hervorgegangen oder nur erschaffen worden sein könnte. Das heißt, identifizieren Sie, ob der Staat ein "Garten Eden" -Staat ist .

Eingang

Ein quadratisches Zustandsraster, wobei 1 "lebendig" und 0 "tot" bedeutet. Wenn Sie möchten, können Sie anstelle von 0 und 1 zwei beliebige unterscheidbare Symbole auswählen.

Die Seitenlänge des Gitters ist nicht Null, sondern kann eine beliebige natürliche Zahl 1 <= N <= 20 sein.

In dieser Generation sind möglicherweise einige oder alle Zellen außerhalb des Eingabegitters aktiv, und in der vorherigen Generation waren möglicherweise einige oder alle Zellen aktiv. Das zu betrachtende Universum ist unendlich, es gibt also keine Randbedingungen. Die Ränder der Eingabe sind nicht die Ränder des Universums. Insbesondere wird das Raster nicht umgebrochen.

Die Eingabe kann in Form einer zeilenbegrenzten Zeichenfolge oder einer einzelnen Zeichenfolge erfolgen. Wenn Sie möchten, können Sie die Seitenlänge oder den Bereich des Rasters als zusätzliche Eingabe verwenden (vor oder nach dem Raster).

Akzeptable Eingabeformate:

010,101,010

010101010

010
101
010
3 010101010

Ausgabe

"Erstellt", wenn kein möglicher vorheriger Zustand (einschließlich Zuständen, die größer als das Eingaberaster sind) vorliegt, der zu dem Eingabezustand bei der nächsten Generation führen würde.

"Entwickelt", wenn mindestens ein möglicher vorheriger Zustand vorhanden ist (einschließlich Zustände, die größer als das Eingaberaster sind), der bei der nächsten Generation zum Eingabezustand führen würde.

Sie können statt "Erstellt" und "Entwickelt" auch zwei beliebige unterscheidbare Zeichenfolgen oder Zahlen verwenden.

Beachten Sie, dass sich der mögliche vorherige Status nicht von der Eingabe unterscheiden muss. Wenn ein Staat sich selbst als nächste Generation hat, sollte er als weiterentwickelt betrachtet werden.

Testfälle

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

Der erstellte Testfall stammt von Achim Flammenkamps Game of Life Page .

Hinweis

Vielen Dank an Trichoplax für das Schreiben dieser Herausforderung und ich habe sie von hier aus angenommen


6
Irgendwelche Komplexitätsbeschränkungen? Wenn ich für eine Eingabe der Größe m-by- nalle möglichen 2^(m*n)Anfangszustände teste , ist die Programmkomplexität groß, aber das Problem wird gelöst, indem ich nur überprüfe, ob das Ergebnis mit der Eingabe übereinstimmt
Luis Mendo

@ Luis für den Eingang? 20 bis 20. Für das Programm? nein
Christopher

2
Ich bin nicht bereit, Golf zu spielen, aber hier ist eine effiziente Implementierung mit einem in SageMath enthaltenen Integer-Programmierlöser von der Stange.
Orlp

Ich gehe davon aus, dass es keine Rolle spielt, ob der vorherige Zustand (falls vorhanden) ein Garten-Eden-Zustand ist oder nicht.
HyperNeutrino

@Hyper nein! Nur was Sie bekommen
Christopher

Antworten:


3

Java - 1254 Bytes - eine sehr schlechte Lösung

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;}}

Es werden Eingaben über die Befehlszeile vorgenommen.

Was es macht

Hier gibt es keine ausgefallenen Tricks, nur eine Brute-Force-Lösung. Es durchläuft jede mögliche Anfangskarte der Größe X, Y und durchläuft sie einmal durch den Game of Life-Algorithmus und vergleicht sie mit der Eingangskarte. Dies dauert SEHR lange, da jede Tafel der Größe x mal y 2 ^ (x * y) mögliche Kombinationen hat. Es dauerte fast 10 Minuten, um ein 4x5-Board zu betreiben. Dumm dumm für etwas, das einfacher ist als es ist.

Wenn es möglich ist, dass es sich um ein entwickeltes Board handelt, wird "entwickelt" gedruckt, und wenn es nicht entwickelt werden konnte, wird "erstellt" gedruckt.


Nett! Ich bin damit einverstanden, dass es für die zeitliche Komplexität sehr schlecht ist, aber hey, es ist das einzige (nicht-plagarisierte), das bisher existiert, so dass es wahrscheinlich ein Kopfgeld bekommen wird! Vorausgesetzt, orlp veröffentlicht das optimierte nicht :)
HyperNeutrino

2
@HyperNeutrino "Du hast diese Runde gewonnen, aber ich habe ein Ass in meinem Loch." - Phillip J. Fry
tuskiomi

Herzlichen Glückwunsch, diese Lösung zahlt sich aus! :)
HyperNeutrino

@HyperNeutrino Ich weiß, dass es nicht klug ist und wahrscheinlich nicht das, wonach Sie suchen, und ich hatte gehofft, andere Lösungen mit diesem leicht zu schlagenden zu inspirieren, aber ich hoffe, es war gut genug.
Tuskiomi

1
auch -1 nicht golfen (haha nur ein Scherz, du hast eine +1, aber dennoch, triviale Golfer könnten gemacht werden);)
HyperNeutrino
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.