Cuộc sống: Tạo ra hay tiến hóa?


17

Đưa ra trạng thái của lưới Game of Life vuông, xác định xem nó có thể phát triển từ bất kỳ trạng thái nào trước đó hay chỉ có thể được tạo. Đó là, xác định xem tiểu bang có phải là tiểu bang "Vườn địa đàng" hay không .

Đầu vào

Một lưới các trạng thái, với 1 chỉ "sống" và 0 chỉ "chết". Bạn có thể chọn bất kỳ hai biểu tượng có thể phân biệt thay vì 0 và 1 nếu bạn muốn.

Độ dài cạnh của lưới sẽ không bằng 0, nhưng có thể là bất kỳ số tự nhiên 1 <= N <= 20.

Bất kỳ hoặc tất cả các ô bên ngoài lưới đầu vào có thể còn sống ở thế hệ này và bất kỳ hoặc tất cả chúng có thể còn sống ở thế hệ trước. Vũ trụ được xem xét là vô hạn, vì vậy không có điều kiện biên. Các cạnh của đầu vào không phải là các cạnh của vũ trụ. Cụ thể, lưới không bọc.

Đầu vào có thể ở dạng một chuỗi được phân tách bằng hàng hoặc một chuỗi đơn. Nếu bạn muốn, bạn có thể lấy chiều dài bên hoặc diện tích của lưới làm đầu vào bổ sung (trước hoặc sau lưới).

Các định dạng đầu vào được chấp nhận:

010,101,010

010101010

010
101
010
3 010101010

Đầu ra

"Đã tạo" nếu không có trạng thái trước có thể (bao gồm cả trạng thái lớn hơn lưới đầu vào) sẽ dẫn đến trạng thái đầu vào ở thế hệ tiếp theo.

"Đã tiến hóa" nếu tồn tại ít nhất một trạng thái trước đó có thể (bao gồm cả các trạng thái lớn hơn lưới đầu vào) sẽ dẫn đến trạng thái đầu vào ở thế hệ tiếp theo.

Bạn có thể sử dụng bất kỳ hai chuỗi hoặc số có thể phân biệt thay vì "Đã tạo" và "Đã tiến hóa" nếu bạn muốn.

Lưu ý rằng trạng thái trước có thể không cần phải khác biệt với đầu vào. Nếu một nhà nước có chính nó như thế hệ tiếp theo, thì nó nên được xem xét phát triển.

Các trường hợp thử nghiệm

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

Trường hợp thử nghiệm được tạo ra được lấy từ Trang trò chơi cuộc sống của Achim Flammenkamp .

Ghi chú

Cảm ơn trichoplax đã viết thử thách này và tôi đã chấp nhận nó từ đây


6
Bất kỳ hạn chế phức tạp? Đối với đầu vào có kích thước m-by- n, nếu tôi kiểm tra tất cả các 2^(m*n)trạng thái ban đầu có thể , độ phức tạp của chương trình sẽ lớn, nhưng nó giải quyết vấn đề bằng cách kiểm tra xem kết quả có khớp với đầu vào không
Luis Mendo

@Luis cho đầu vào? 20 bằng 20. Cho chương trình? không
Christopher

2
Tôi không thể thích chơi golf, nhưng đây là một triển khai hiệu quả bằng cách sử dụng bộ giải lập trình số nguyên có sẵn trong SageMath.
orlp

Tôi cho rằng không quan trọng việc trạng thái trước đó (nếu có) có phải là trạng thái Vườn Địa đàng hay không?
HyperNeutrino

@Hyper không! Chỉ những gì bạn nhận được
Christopher

Câu trả lời:


3

Java- 1254 byte- một giải pháp rất ké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;}}

Nó nhận đầu vào thông qua dòng lệnh.

Những gì nó làm

Không có thủ thuật ưa thích ở đây, chỉ đơn giản là một giải pháp vũ phu. Nó đi qua mọi bảng bắt đầu có thể có kích thước X, Y và lặp lại nó một lần thông qua thuật toán Game of Life và kiểm tra nó với bảng đầu vào. Điều này mất một thời gian RẤT lâu, vì mỗi bảng có kích thước x theo y có 2 ^ (x * y) có thể kết hợp. Phải mất gần 10 phút để chạy một bảng 4x5. Ngớ ngẩn ngớ ngẩn cho một cái gì đó đơn giản hơn nó.

Nếu có thể đó là một bảng đã tiến hóa, nó sẽ in "tiến hóa" và nếu không thể phát triển được, nó sẽ in "được tạo ra".


Đẹp! Tôi đồng ý rằng nó rất kém về độ phức tạp của thời gian, nhưng này, nó là thứ duy nhất (không bị tước quyền) cho đến nay có lẽ nó sẽ nhận được tiền thưởng! Giả sử orlp không đăng bài được tối ưu hóa :)
HyperNeutrino

2
@HyperNeutrino "Bạn đã thắng vòng này, nhưng tôi có một cú ace lên lỗ của tôi." - Phillip J. Fry
tuskiomi

Xin chúc mừng, giải pháp này có tiền thưởng! :)
HyperNeutrino

@HyperNeutrino Tôi biết nó không thông minh, và có lẽ không phải là thứ bạn đang tìm kiếm, và tôi hy vọng sẽ truyền cảm hứng cho các giải pháp khác với giải pháp dễ đánh bại này, nhưng tôi hy vọng nó đủ tốt.
tuskiomi

1
cũng -1 không chơi gôn (haha chỉ đùa bạn có +1 nhưng vẫn có thể chơi
golf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.