Визначення послідовностей клітинних автоматів


10

Фон

Для цілей цього виклику, державний nстільниковий автомат - це просто двійкова функція, fяка приймає два числа з набору стану {0, 1, ..., n-1}як входи і повертає інше число з цього набору як вихід. Він може бути застосований до списку чисел довжиною не менше 2 балівL = [x0, x1, x2, ..., xk-1]

f(L) = [f(x0, x1), f(x1, x2), f(x2, x3), ..., f(xk-2, xk-1)]

Зауважте, що в отриманому списку є один менший елемент, ніж оригінал. Просторово - тимчасова схема , з fпочинаючи з Lсписком списків , отриманих шляхом багаторазового застосування fдо L, і збираючи результати у вигляді списку. Кінцевий список має довжину 1. Ми говоримо, що список Lє ідентифікаційною послідовністю для f, якщо кожен двоелементний список над набором станів є суміжним підспілом деякого рядка діаграми проміжок часу, починаючи з цього L. Це еквівалентно умові, що жодна інша nдержава CA не має такої точної діаграми простір-часу.

Вхідні дані

Входи є nматрицею з розмірністю nцелочисленной матрицею M, списком цілих чисел Lдовжиною , щонайменше 2, і , можливо , кількість n. Матриця Mвизначає nCA-державу fза f(a,b) = M[a][b]допомогою (використовуючи індексацію на основі 0). Це гарантує , що n > 0, і що Mі Lмістить тільки елементи державного набору {0, 1, ..., n-1}.

Вихідні дані

Вихід повинен бути узгодженим значенням, якщо Lвоно є ідентифікуючою послідовністю для СА f, і послідовним помилковим значенням в іншому випадку. Це означає, що всі "так" -речовини призводять до однакового значення, а всі "ні" -речовини призводять до однакової помилкової цінності.

Приклад

Розглянемо входи n = 2, M = [[0,1],[1,0]]і L = [1,0,1,1]. Матриця Mвизначає двійковий XOR автомат f(a,b) = a+b mod 2, і просторово - тимчасова схема , починаючи з LIS

1 0 1 1
1 1 0
0 1
1

Ця діаграма не містить 0 0жодного рядка, тому Lне є ідентифікаційною послідовністю, а правильним є вихід False. Якщо ми введемо L = [0,1,0,0]замість цього, діаграма простору - це час

0 1 0 0
1 1 0
0 1
1

Рядки цієї діаграми містять усі пари, проведені з набору стану, а саме 0 0- 0 1, 1 0і 1 1- так Lє ідентифікаційна послідовність і правильний вихід True.

Правила

Ви можете написати повну програму або функцію. Виграє найменший байт, а стандартні лазівки заборонені.

Випробування

Trivial automaton
[[0]] [0,0] 1 -> True
Binary XOR
[[0,1],[1,0]] [1,0,1,1] 2 -> False
[[0,1],[1,0]] [1,0,1,0] 2 -> True
[[0,1],[1,0]] [0,1,0,0] 2 -> True
Addition mod 3
[[0,1,2],[1,2,0],[2,0,1]] [0,1,1,0,0,0,1,0,0] 3 -> False
[[0,1,2],[1,2,0],[2,0,1]] [0,1,1,0,0,0,1,0,1] 3 -> True
Multiplication mod 3
[[0,0,0],[0,1,2],[0,2,1]] [0,1,1,2,0,0,1,0,1] 3 -> False
[[0,0,0],[0,1,2],[0,2,1]] [0,1,1,2,2,2,1,0,1] 3 -> True
Some 4-state automata
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,0,0,0,1,1,1,1] 4 -> False
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,0,0,1,0,1,1,1] 4 -> False
[[3,2,2,1],[0,0,0,1],[2,1,3,1],[0,1,2,3]] [0,1,2,3,3,1,2,3,0] 4 -> True
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,0,1,1,2,2,0,2,1] 4 -> False
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,3,1,3,2,3,3,0,1] 4 -> False
[[0,1,2,1],[1,0,2,0],[2,2,1,0],[1,2,0,0]] [0,3,1,3,2,3,3,0,1,2] 4 -> True

Відповіді:


2

CJam, 53 43 42 байт

l~:M;_,({_[\1>]zW<_{M\{=}/}%}*;](_*\L*_&,=

Це дуже пряма реалізація цього визначення (я взяв деяке натхнення у Якубе після моєї першої спроби). Він очікує введення в STDIN в зворотному порядку, використовуючи масиви стилю CJam:

2 [1 0 1 1] [[0 1][1 0]]

Ось тестовий джгут, який запускає код на всі входи (спочатку перетворюючи їх у правильний формат введення). Результати в полі введення фактично не використовуються. Видаліть їх, якщо ви мені не довіряєте. ;)


5

Пітон 2: 93 байт

M,L,n=input();a=[]
while L:z=zip(L,L[1:]);a+=z;L=[M[i][j]for i,j in z]
print len(set(a))==n*n

Безпосередня реалізація: Знайдіть усі пари, блискавки, запам’ятайте їх для подальшого та застосуйте M до L. Повторіть. Порівняйте кількість знайдених унікальних пар.

Введення має форму [[0,1],[1,0]], [0,1,0,0], 2.


2

Математика, 90 83 82 байт

f=Length[Union@@Last@Reap[#2//.l_List:>Extract[#,Sow/@Partition[l+1,2,1]]]]==#3^2&

Інша пряма реалізація.

Використання:

f[{{0, 1}, {1, 0}}, {0, 1, 0, 0}, 2]

Правда

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