Yaşam: Yaratıldı mı Evrim mi?


17

Kare bir Hayat Oyunu ızgarasının durumu göz önüne alındığında, önceki herhangi bir durumdan evrimleşmiş olabilir mi yoksa sadece yaratılabilir mi olduğunu belirleyin. Yani, devletin "Cennet Bahçesi" devleti olup olmadığını belirleyin .

Giriş

1 kare "canlı" ve 0 "ölü" anlamına gelen kare şeklinde bir kare ızgara. İsterseniz 0 ve 1 yerine iki ayırt edilebilir sembol seçebilirsiniz.

Izgaranın yan uzunluğu sıfır olmayacaktır, ancak herhangi bir doğal sayı 1 <= N <= 20 olabilir.

Giriş ızgarasının dışındaki hücrelerin herhangi biri veya tümü bu nesilde canlı olabilir ve bunların herhangi biri veya tümü önceki nesilde canlı olabilir. Dikkate alınacak evren sonsuzdur, bu yüzden sınır koşulları yoktur. Girdinin kenarları evrenin kenarları değildir. Özellikle, ızgara sarılmaz.

Giriş, satırla ayrılmış bir dize veya tek bir dize biçiminde olabilir. İsterseniz, ızgara uzunluğunu veya alanını ek bir giriş olarak alabilirsiniz (ızgaradan önce veya sonra).

Kabul edilebilir giriş biçimleri:

010,101,010

010101010

010
101
010
3 010101010

Çıktı

Gelecek nesilde giriş durumuna yol açabilecek olası bir önceki durum (giriş ızgarasından daha büyük durumlar dahil) varsa "Oluşturuldu".

Gelecek nesilde giriş durumuna yol açabilecek en az bir olası önceki durum (giriş ızgarasından daha büyük durumlar dahil) varsa "evrimleşti".

İsterseniz "Oluşturuldu" ve "Geliştirildi" yerine iki ayırt edilebilir dize veya sayı kullanabilirsiniz.

Olası önceki durumun girişten farklı olması gerekmediğini unutmayın. Eğer bir devletin bir sonraki nesil olması durumunda, o zaman evrim geçirilmiş sayılmalıdır.

Test senaryoları

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

Oluşturulan test senaryosu Achim Flammenkamp'in Hayat Oyunu Sayfasından alınmıştır .

Not

Bu zorluğu yazdığı için trichoplax'a teşekkürler ve buradan kabul ettim


6
Herhangi bir karmaşıklık sınırlaması var mı? m-By- boyutunda bir girdi için, ntüm olası 2^(m*n)başlangıç ​​durumlarını test edersem , program karmaşıklığı büyük olur, ancak sonucun girişle eşleşip eşleşmediğini kontrol ederek sorunu çözer
Luis Mendo

@ Giriş için luis? 20 x 20. Program için mi? hayır
Christopher

2
Ben golf için silahlı olamaz , ama burada SageMath birlikte paketlenmiş bir raf tamsayı programlama çözücü kullanarak verimli bir uygulama .
orlp

Önceki durumun (eğer varsa) bir Cennet Bahçesi devleti olup olmadığı önemli değil midir?
HyperNeutrino

@Hyper hayır! Sadece ne alırsın
Christopher

Yanıtlar:


3

Java- 1254 bayt- çok zayıf bir çözüm

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

Komut satırı üzerinden girdi alır.

Bu ne yapar

Burada süslü hile yok, sadece kaba bir kuvvet çözümü. X, Y boyutundaki her olası başlangıç ​​kartından geçer ve Yaşam Oyunu algoritması ile tekrarlar ve giriş kartına karşı kontrol eder. Bu, x ile y boyutundaki her bir panoda 2 ^ (x * y) olası kombinasyon bulunduğundan ÇOK uzun zaman alır. 4x5 kartı çalıştırmak neredeyse 10 dakika sürdü. Daha basit bir şey için aptalca aptalca.

Evrimleşmiş bir tahta olması mümkünse, "evrimleşti" yazdırır ve eğer evrimleşmemişse, "yaratılmış" yazdırır.


Güzel! Ben zaman karmaşıklığı için çok kötü olduğunu kabul ediyorum ama hey, şimdiye kadar sadece (plagarize olmayan) biri bu yüzden muhtemelen lütuf alacak! Orlp'nin optimize edilmiş olanı yayınlamadığını varsayarsak :)
HyperNeutrino

2
@HyperNeutrino "Bu raundu kazandınız, ama deliğimde bir asım var." - Phillip J. Fry
tuskiomi

Tebrikler, bu çözüm cömertliği alır! :)
HyperNeutrino

@HyperNeutrino Zeki olmadığını ve muhtemelen aradığınız şeyin olmadığını biliyorum ve bu kolayca yenilebilir olanla diğer çözümlere ilham vermeyi umuyordum, ama umarım yeterince iyiydi.
tuskiomi

1
Ayrıca -1 golf değil (haha sadece bir +1 var şaka yapıyorum ama yine de önemsiz golf yapılabilir);)
HyperNeutrino
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.