Життя: створене чи розвинене?


17

Враховуючи стан квадратної сітки гри Життя, визначте, чи вона могла розвинутись із будь-якого попереднього стану, чи лише могла бути створена. Тобто визначте, чи є держава державою «Едемський сад» .

Вхідні дані

Квадратна сітка штатів, в якій 1 вказує "живий", а 0 - "мертвий". Ви можете вибрати будь-які два відмінних символу замість 0 та 1, якщо бажаєте.

Бічна довжина сітки не буде нульовою, але може бути будь-яким натуральним числом 1 <= N <= 20.

Будь-яка або всі комірки поза вхідною сіткою можуть бути живими в цьому поколінні, і будь-яка або всі вони можуть бути живими в попередньому поколінні. Всесвіт, що розглядається, нескінченний, тому немає граничних умов. Краї вводу - це не краї Всесвіту. Зокрема, сітка не загортається.

Вхід може бути у вигляді рядка з обмеженим рядком або одного рядка. За бажанням ви можете взяти бічну довжину або площу сітки як додатковий вхід (до або після сітки).

Прийнятні вхідні формати:

010,101,010

010101010

010
101
010
3 010101010

Вихідні дані

"Створено", якщо немає можливого попереднього стану (включаючи стани, більші за вхідну сітку), які призвели б до стану введення для наступного покоління.

"Еволюціонував", якщо існує принаймні одне можливе попереднє стан (включаючи стани, більші за вхідну сітку), що призведе до стану введення для наступного покоління.

Ви можете використовувати будь-які два відмінних рядки або числа замість "Створено" та "Еволюціонувало", якщо бажаєте.

Зауважте, що можливий попередній стан не потрібно відрізняти від вхідного. Якщо держава вважає себе наступним поколінням, то це слід вважати розвиненим.

Тестові справи

010
101
010 Evolved

0101110100
0010101001
1011100110
0101111101
1001001111
1111001001
1011111010
0110011101
1001010100
0010111010 Created

Створений тестовий випадок взято зі сторінки «Життя життя Ахіма Фламменкампа» .

Примітка

Завдяки trichoplax для написання цього виклику, і я прийняв його звідси


6
Будь-які обмеження складності? Для введення розміру m-by- n, якщо я перевіряю всі можливі 2^(m*n)початкові стани, складність програми буде великою, але вона вирішує проблему, просто перевіривши, чи відповідає результат вводу
Луїс Мендо

@Luis для введення? 20 на 20. Для програми? ні
Крістофер

2
Я не можу подужати його гольфом, але ось ефективна реалізація, що використовує програмне рішення для програмування цілих чисел на полиці, що вкладається в SageMath.
orlp

Я припускаю, що не має значення, чи є попередній стан (якщо він існує) Едемським садом?
HyperNeutrino

@Hyper nope! Тільки те, що ти отримуєш
Крістофер

Відповіді:


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) можливих комбінацій. Щоб запустити плату 4x5, знадобилося майже 10 хвилин. Тупо дурно за щось, що простіше, ніж воно є.

Якщо можливо, що це була дошка, що розвивалася, вона друкує "еволюціонував", і якщо вона не могла бути розвинена, вона друкує "створене".


Приємно! Я погоджуюсь, що це дуже погано за часом складності, але ей, це єдиний (не плакатий) поки що, так що він, ймовірно, отримає винагороду! Припустимо, що orlp не розміщує оптимізованого :)
HyperNeutrino

2
@HyperNeutrino "Ви виграли цей раунд, але у мене туз у моєму отворі". - Філіп Дж. Фрай
тускіомі

Вітаємо, це рішення бере нагороду! :)
HyperNeutrino

@HyperNeutrino Я знаю, що це не розумно, і, мабуть, не те, що ти шукаєш, і я сподівався надихнути інші рішення на цей легкодоступний, але я сподіваюся, що це було досить добре.
тускіоми

1
також -1 не в гольф (ха-ха, просто жартую, що ти отримав +1, але все-таки, тривіальні гольфи можна зробити);)
HyperNeutrino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.