Змініть правила життя


15

Життєздатний стільниковий автомат - це стільниковий автомат, схожий на «Гра життя» Конвея, оскільки вони працюють на (теоретично) нескінченно великій квадратній сітці, де кожна клітина має рівно 8 сусідів, і є одним із 2 станів, а саме живих і мертвих .

Однак ці подібні версії різняться вирішальним чином: правила, щоб дана клітина ожила і правила для даної клітини, щоб вижити до наступного покоління.

Наприклад, у класичній грі життя використовується правило B3/S23, яке означає, що для виживання нової клітини потрібно 3 живих клітини та 2 або 3 живих сусіда, щоб вижити. Для цього виклику будемо вважати, що сусіди не включають себе, тому кожна клітина має рівно 8 сусідів.

Ваше завдання - задаючи конфігурацію запуску, правило народження, правило виживання і ціле додатне число (кількість поколінь, які слід керувати), імітувати життєвий автомат, використовуючи ці правила для кількості поколінь, наведених у найкоротшому можливому коді . Початковою конфігурацією буде квадратний матричний / двовимірний масив або багаторядковий рядок, який ви можете вибрати. Інші можуть надаватися у будь-якому розумному форматі та способі.

Наприклад, якщо правило народження було 12345678(будь-які живі сусіди), то правило виживання було 2357і стартовою конфігурацією було

0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0

наступні два покоління будуть

Generation 1:           Generation 2:

0 0 0 0 0               1 1 1 1 1
0 1 1 1 0               1 1 0 1 1
0 1 0 1 0               1 0 1 0 1
0 1 1 1 0               1 1 0 1 1
0 0 0 0 0               1 1 1 1 1

Якби кількість поколінь, що давались, становила 10, вихід був би чимось узгодженим

0 1 1 1 0
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
0 1 1 1 0

Вам не доведеться обробляти зміни, які відбуваються поза межами, заданими вхідною матрицею, однак, усі комірки поза матрицею починають мертвими. Тому матриця введення може бути будь-якого розміру, аж до максимального значення, яке може підтримувати ваша мова. Вам не доведеться виводити плату між поколіннями.

Це тому найкоротший код виграє.

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

Вони використовують B/Sпозначення для позначення використовуваних правил

B2/S2, generations = 100Конфігурація:

1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

Вихід:

0 0 0 0 0 0 0 0
0 1 0 0 0 0 1 0
1 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

B1357/S2468, generations = 12Конфігурація:

1 0 1 0 1 0
0 1 1 0 1 0
1 0 0 0 0 0
0 0 0 0 0 1
1 1 1 1 1 0
0 1 1 0 0 1

Вихід:

0 1 0 0 0 0
0 1 1 1 1 0
0 1 0 1 1 0
1 1 1 0 0 0
0 0 1 1 1 0
0 1 1 0 0 0

Якщо вам потрібно генерувати більше тестових випадків, ви можете використовувати цей чудовий тренажер. Будь ласка, не забудьте обмежити розмір дошки


Чи є моделювання тороїдальним?
Ерік Аутгольфер

@EriktheOutgolfer немає, оскільки матриця має (теоретично) нескінченний розмір
caird coinheringaahing

Також, чи можна вважати, що дана матриця є квадратною?
Ерік Аутгольфер

2
@EriktheOutgolfer "нескінченно велика квадратна сітка"
caird coinheringaahing

Але це не говорить про те, що ви можете припустити, що… буде редагувати.
Ерік Аутгольфер

Відповіді:


9

MATL , 24 23 байти

xx:"tt3Y6Z+1Gm<8M2Gmb*+

Вхідні дані:

  • Масив з правилом народження
  • Масив із правилом виживання
  • Кількість поколінь
  • Матриця з початковою конфігурацією комірки з використанням ;роздільника рядків.

Спробуйте в Інтернеті! Або дивіться тестові випадки: 1 , 2 .

Ще на кілька байт можна побачити еволюцію в мистецтві ASCII .

Пояснення

xx      % Take two inputs implicitly: birth and survival rules. Delete them
        % (but they get copied into clipboard G)
:"      % Take third input implicitly: number of generations. Loop that many times
  tt    %   Duplicate twice. This implicitly takes the initial cell configuration
        %   as input the first time. In subsequent iterations it uses the cell 
        %   configuration from the previous iteration
  3Y6   %   Push Moore neighbourhood: [1 1 1; 1 0 1; 1 1 1]
  Z+    %   2D convolution, maintaining size
  1G    %   Push first input from clipboard G: birth rule
  m     %   Ismember: gives true for cells that fulfill the birth rule
  <     %   Less than (element-wise): a cell is born if it fulfills the birth rule
        %   *and* was dead
  8M    %   Push result of convolution again, from clipboard M
  2G    %   Push second input from clipboard G: survival rule
  m     %   Ismember: gives true for cells that fulfill the survival rule
  b     %   Bubble up the starting cell configuration
  *     %   Multiply (element-wise): a cell survives if it fulfills the survival
        %   rule *and* was alive
  +     %   Add: a cell is alive if it has been born or has survived, and those
        %   are exclusive cases. This produces the new cell configuration
        % Implicit end loop. Implicit display

Чи можете ви зберегти байти, змінивши порядок входів? На xxпочатку мені здається трохи марнотратним ...
Ерік Атголфер

@EriktheOutgolfer Я не бачу як. Мені потрібно видалити перші два, щоб пізніше їх повторно використати кілька разів (один за ітерацію), а інші дані вже неявні
Луїс Мендо

Так, "видалення" входів додає їх до якогось списку входів?
Erik the Outgolfer

@EriktheOutgolfer Так. Введення MATL є інтерактивним, тобто програма заздалегідь не знає, скільки вхідних даних є. Тут, видалення з порожнього стека спричиняє імплікаційний вхід. Щойно зроблено, кожен вхід буде скопійований у буфер обміну G, і їх можна буде отримати пізніше.
Луїс Мендо

3

Мова Вольфрама (Mathematica) , 144 122 байти

CellularAutomaton[{Tr[2^#&/@Flatten@MapIndexed[2#+2-#2[[1]]&,{#2,#3},{2}]],{2,{{2,2,2},{2,1,2},{2,2,2}}},{1,1}},#,{{#4}}]&

Спробуйте в Інтернеті!

Приклад використання:

%[RandomInteger[1, {10, 10}], {2, 3}, {3}, 5]

використовує випадкову сітку 10х10 в якості старту, виживає з 2 або 3 сусідами, народження з 3 сусідами, графік результату на 5 ітерацій.


Шкода, що вбудований лише один розмір (виправте мене, якщо я помиляюся)
Zacharý

Я використовую вбудований "CellularAutomaton" з тоталістичним правилом з 9 сусідів. Значна частина коду перетворює введення виживання / народження в число правила.
Келлі Лоудер

1

R , 256 байт

function(x,B,S,r){y=cbind(0,rbind(0,x,0),0)
n=dim(y)[1]
z=c(1,n)
f=function(h){w=-1:1
b=h%%n+1
a=(h-b+1)/n+1
'if'(a%in%z|b%in%z,0,sum(x[w+b,w+a])-x[b,a])}
while(r){x=y
for(i in 1:n^2){u=f(i-1)
y[i]=u%in%B
y[i]=(y[i]&!x[i])|(x[i]&(u%in%S))}
r=r-1}
y[-z,-z]}

Спробуйте в Інтернеті!

На жаль, це виглядає не так гольф, як я сподівався.

Введення : матриця R та параметри виклику. Вихід : матриця після R поколінь.

Алгоритм вкладає матрицю з нулями для обробки меж. Потім, ітеративно: 1-е) воно застосовує правило народження і 2-е) воно вбиває раніше існуючі клітини, які не пройшли правило виживання. Прокладки видаляються при поверненні.


приємна кількість байтів!
Джузеппе

Мені вдалося дістати його до 217 байт, але якщо ми зможемо знайти ще один гольф, ми зможемо дістати його 216як мінімум куб ...
Джузеппе

1

Python 2 , 156 149 146 байт

lambda R,g,c:g and f(R,g-1,[[`sum(sum(l[y+y/~y:y+2])for l in c[x+x/~x:x+2])-c[x][y]`in R[c[x][y]]for y,_ in e(c)]for x,_ in e(c)])or c
e=enumerate

Спробуйте в Інтернеті!

Бере участь:

  • Rules: [birth,survial]правила як список string. напр. (['135','246'] )
  • gенерації: int
  • cналаштування: квадратний 2D масив 1/0абоTrue/False

Повертає 2d масив True/False

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