Идентификация последовательностей для клеточных автоматов

10

Фон

Для целей этой задачи nсотовый автомат -состояния - это просто двоичная функция, fкоторая принимает два числа из состояния, заданного в {0, 1, ..., n-1}качестве входных данных, и возвращает другое число из этого набора в качестве выходных. Это может быть применено к списку чисел длиной не менее 2L = [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ЦС нет такой точной пространственно-временной диаграммы.

вход

Входы являются 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является идентифицирующей последовательностью для CA 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
Zgarb
источник

Ответы:

2

CJam, 53 43 42 байта

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

Это очень прямолинейная реализация определения (после первой попытки я черпал вдохновение у Якуба). Он ожидает ввода в обратном порядке на STDIN, используя массивы в стиле CJam:

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

Вот тестовая схема, которая запускает код для всех входных данных (сначала преобразуя их в правильный входной формат). Результаты в поле ввода фактически не используются. Убери их, если не веришь мне. ;)

Мартин Эндер
источник
5

Python 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

Простая реализация: найдите все пары по zip, запомните их на потом и примените M к L. Repeat. Сравните количество найденных уникальных пар.

Вход имеет форму [[0,1],[1,0]], [0,1,0,0], 2.

Jakube
источник
2

Mathematica, 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]

Правда

alephalpha
источник