ชีวิต: สร้างหรือพัฒนา


17

เมื่อพิจารณาถึงสถานะของตารางเกมแห่งชีวิตตารางตรวจสอบว่ามันอาจมีการพัฒนาจากสถานะก่อนหน้าใด ๆ หรืออาจถูกสร้างขึ้นเท่านั้น นั่นคือระบุว่ารัฐเป็นรัฐ"Garden of Eden"หรือไม่

อินพุต

กริดของรัฐที่มี 1 ระบุว่า "มีชีวิตอยู่" และ 0 หมายถึง "ตาย" คุณสามารถเลือกสองสัญลักษณ์ที่แตกต่างแทน 0 และ 1 หากคุณต้องการ

ความยาวด้านของกริดจะไม่เป็นศูนย์ แต่อาจเป็นจำนวนธรรมชาติใด ๆ 1 <= N <= 20

เซลล์ใด ๆ หรือทั้งหมดที่อยู่นอกกริดอินพุตอาจมีชีวิตในรุ่นนี้และเซลล์ใด ๆ หรือทั้งหมดอาจมีชีวิตอยู่ในรุ่นก่อนหน้า เอกภพที่จะพิจารณานั้นไม่มีที่สิ้นสุดดังนั้นจึงไม่มีเงื่อนไขขอบเขต ขอบของอินพุตไม่ใช่ขอบของจักรวาล โดยเฉพาะอย่างยิ่งกริดไม่ได้ห่อ

อินพุตอาจอยู่ในรูปแบบของสตริงที่คั่นด้วยแถวหรือสตริงเดี่ยว หากคุณต้องการคุณอาจใช้ความยาวด้านหรือพื้นที่ของกริดเป็นอินพุตเพิ่มเติม (ก่อนหรือหลังกริด)

รูปแบบอินพุตที่ยอมรับได้:

010,101,010

010101010

010
101
010
3 010101010

เอาท์พุต

"สร้าง" หากไม่มีสถานะก่อนหน้านี้ที่เป็นไปได้ (รวมถึงสถานะที่ใหญ่กว่ากริดอินพุต) ที่จะนำไปสู่สถานะอินพุตในรุ่นถัดไป

"Evolved" ถ้ามีอยู่อย่างน้อยหนึ่งสถานะก่อนหน้านี้ที่เป็นไปได้ (รวมถึงสถานะที่ใหญ่กว่ากริดอินพุต) ที่จะนำไปสู่สถานะอินพุตในรุ่นถัดไป

คุณสามารถใช้สตริงหรือตัวเลขสองตัวที่แยกได้แทน "สร้าง" และ "วิวัฒนาการ" หากคุณต้องการ

โปรดทราบว่าสถานะก่อนหน้าที่เป็นไปได้ไม่จำเป็นต้องแตกต่างจากอินพุต หากรัฐมีตัวเองเป็นรุ่นต่อไปก็ควรได้รับการพิจารณาวิวัฒนาการ

กรณีทดสอบ

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

กรณีทดสอบที่สร้างขึ้นจะนำมาจากเกม Achim Flammenkamp ของชีวิตหน้า

บันทึก

ขอบคุณ trichoplax สำหรับการเขียนความท้าทายนี้และฉันยอมรับมันจากที่นี่


6
มีข้อ จำกัด ด้านความซับซ้อนหรือไม่? สำหรับการป้อนข้อมูลของขนาดm-by- nถ้าผมทดสอบเป็นไปได้ทั้งหมด2^(m*n)รัฐเริ่มต้นความซับซ้อนของโปรแกรมจะมีขนาดใหญ่ แต่ก็แก้ปัญหาโดยเพียงแค่การตรวจสอบหากผลที่ตรงกับการป้อนข้อมูล
หลุยส์ Mendo

@Luis สำหรับการป้อนข้อมูลหรือไม่ 20 จาก 20 สำหรับโปรแกรม? ไม่
Christopher

2
ฉันไม่สามารถออกไปตีกอล์ฟได้แต่นี่คือการใช้งานที่มีประสิทธิภาพโดยใช้ตัวแก้การเขียนโปรแกรมเลขจำนวนเต็มแบบชั้นวางซึ่งรวมอยู่ใน SageMath
orlp

ฉันคิดว่ามันไม่สำคัญว่ารัฐก่อนหน้า (ถ้ามีอยู่) เป็นรัฐการ์เด้นเอเดนหรือไม่?
HyperNeutrino

@Hyper ไม่! สิ่งที่คุณจะได้รับ
Christopher

คำตอบ:


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 คูณ y จะมีชุดค่าผสมที่เป็นไปได้ 2 ^ (x * y) ใช้เวลาเกือบ 10 นาทีในการรันบอร์ด 4x5 โง่อย่างโง่เขลาสำหรับสิ่งที่ง่ายกว่านั้น

ถ้าเป็นไปได้ว่ามันเป็นบอร์ดที่มีวิวัฒนาการมันจะพิมพ์ "วิวัฒน์" และถ้ามันไม่สามารถพัฒนาได้มันก็จะพิมพ์ "สร้างขึ้น"


ดี! ฉันยอมรับว่ามันแย่มากสำหรับความซับซ้อนของเวลา แต่เดี๋ยวก่อนมันเป็นเพียงหนึ่งเดียว (ไม่ใช่แบบ plagarized) จนถึงตอนนี้ดังนั้นมันอาจจะได้รับความโปรดปราน! สมมติว่า orlp ไม่ได้โพสต์หนึ่งที่ดีที่สุด :)
HyperNeutrino

2
@HyperNeutrino "คุณชนะรอบนี้ แต่ฉันมีเอซขึ้นหลุมของฉัน" - Phillip J. Fry
tuskiomi

ขอแสดงความยินดีทางออกนี้ใช้เงินรางวัล! :)
HyperNeutrino

@HyperNeutrino ฉันรู้ว่ามันไม่ฉลาดและอาจไม่ใช่สิ่งที่คุณกำลังมองหาและฉันหวังว่าจะเป็นแรงบันดาลใจในการแก้ไขปัญหาอื่น ๆ ด้วยโซลูชันที่เอาชนะได้ง่ายนี้ แต่ฉันหวังว่ามันจะดีพอ
tuskiomi

1
-1 ยังไม่ได้เล่นกอล์ฟด้วย (ฮ่า ๆ แค่ล้อเล่นคุณจะได้ +1 แต่ก็ยังสามารถเล่นกอล์ฟได้เล็กน้อย);)
HyperNeutrino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.