Hidup: Diciptakan atau Berkembang?

17

Dengan keadaan kotak Game of Life yang persegi, tentukan apakah itu bisa berevolusi dari kondisi sebelumnya, atau hanya bisa dibuat. Yaitu, kenali apakah negara itu adalah negara "Taman Eden" .

Memasukkan

Kotak persegi menyatakan, dengan 1 menunjukkan "hidup" dan 0 menunjukkan "mati". Anda dapat memilih dua simbol yang dapat dibedakan daripada 0 dan 1 jika diinginkan.

Panjang sisi kisi tidak akan nol, tetapi bisa berupa bilangan asli 1 <= N <= 20.

Setiap atau semua sel di luar grid input mungkin hidup pada generasi ini, dan salah satu atau semua dari mereka mungkin telah hidup pada generasi sebelumnya. Alam semesta yang dipertimbangkan tidak terbatas, sehingga tidak ada syarat batas. Tepi input bukan tepi alam semesta. Secara khusus, kisi tidak membungkus.

Input mungkin dalam bentuk string yang dibatasi baris, atau string tunggal. Jika diinginkan, Anda dapat menggunakan panjang sisi atau area kisi sebagai input tambahan (sebelum atau setelah kisi).

Format input yang dapat diterima:

010,101,010

010101010

010
101
010
3 010101010

Keluaran

"Dibuat" jika tidak ada keadaan sebelumnya yang mungkin (termasuk keadaan yang lebih besar dari kisi masukan) yang akan mengarah ke keadaan masukan pada generasi berikutnya.

"Evolved" jika terdapat setidaknya satu keadaan sebelumnya yang mungkin (termasuk keadaan lebih besar dari kisi masukan) yang akan mengarah pada keadaan masukan pada generasi berikutnya.

Anda dapat menggunakan dua string atau angka yang dapat dibedakan sebagai ganti "Dibuat" dan "Berkembang" jika diinginkan.

Perhatikan bahwa keadaan sebelumnya yang mungkin tidak perlu berbeda dari input. Jika sebuah negara memiliki dirinya sebagai generasi berikutnya, maka ia harus dianggap berevolusi.

Uji kasus

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

Kasing uji coba diambil dari Game of Life Page milik Achim Flammenkamp .

Catatan

Berkat trichoplax untuk menulis tantangan ini dan saya mengadopsinya dari sini

Christopher
sumber
6
Adakah batasan kompleksitas? Untuk input ukuran m-dengan- n, jika saya menguji semua 2^(m*n)keadaan awal yang mungkin , kompleksitas program akan menjadi besar, tetapi itu memecahkan masalah dengan hanya memeriksa apakah hasilnya cocok dengan input
Luis Mendo
@Luis untuk input? 20 sebelum 20. Untuk program? tidak
Christopher
2
Saya tidak bisa menggunakan golf, tapi di sini ada implementasi yang efisien menggunakan pemecah pemrograman integer yang dibundel dalam SageMath.
orlp
Saya berasumsi bahwa tidak masalah apakah keadaan sebelumnya (jika ada) adalah keadaan Taman Eden?
HyperNeutrino
@Hyper nggak! Hanya apa yang Anda dapatkan
Christopher

Jawaban:

3

Java- 1254 bytes- solusi yang sangat buruk

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

Dibutuhkan input melalui baris perintah.

Apa yang dilakukannya

Tidak ada trik mewah di sini, hanya solusi kekerasan. Ia melewati setiap papan awal yang mungkin dari ukuran X, Y dan mengulanginya sekali melalui algoritma Game of Life dan memeriksanya terhadap papan input. Ini membutuhkan waktu yang SANGAT lama, karena setiap papan ukuran x oleh y memiliki 2 ^ (x * y) kemungkinan kombinasi. Butuh hampir 10 menit untuk menjalankan papan 4x5. Bodohnya bodoh untuk sesuatu yang lebih sederhana dari itu.

Jika mungkin itu adalah papan berevolusi, ia mencetak "berevolusi.", Dan jika itu tidak mungkin telah berevolusi, itu mencetak "dibuat.".

tuskiomi
sumber
Bagus! Saya setuju bahwa itu sangat buruk untuk kompleksitas waktu tetapi hei, itu satu-satunya (non-plagarized) sejauh ini sehingga mungkin akan mendapatkan hadiahnya! Dengan asumsi orlp tidak memposting yang dioptimalkan :)
HyperNeutrino
2
@HyperNeutrino "Kamu memenangkan babak ini, tapi aku punya kartu as di lubangku." - Phillip J. Fry
tuskiomi
Selamat, solusi ini membutuhkan karunia! :)
HyperNeutrino
@HyperNeutrino Saya tahu itu tidak pintar, dan mungkin bukan yang Anda cari, dan saya berharap untuk menginspirasi solusi lain dengan yang mudah dikalahkan ini, tapi saya harap itu cukup bagus.
tuskiomi
1
juga -1 tidak bermain golf (haha hanya bercanda Anda mendapat +1 tetapi masih, golf sepele bisa dibuat);)
HyperNeutrino