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


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.