세포질 오토마타에 대한 서열 식별


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반복적으로 적용함으로써 얻어리스트의 목록 fL한리스트에서 결과를 수집. 최종리스트는 우리가리스트라고 길이 1을 가지고 L이다 식별 시퀀스 에 대한 f상태 세트에 걸쳐 매 2 요소리스트로부터 시작 시공간도 일부 행의 인접 하위 목록 인 경우 L. 이는 다른 nCA가 정확한 시공간 다이어그램을 가지고 있지 않은 조건과 동일합니다 .

입력

귀하가 입력되어 n-by- n정수 행렬 M정수 목록 L적어도 길이 2, 임의로 숫자 n. 이 매트릭스 M는 0 기반 인덱싱을 사용하여-상태 nCA f를 정의합니다 f(a,b) = M[a][b]. 그것은 보장되고 n > 0, 그 ML상태 만 세트의 요소를 포함 {0, 1, ..., n-1}.

산출

LCA에 대한 식별 시퀀스 인 경우 출력은 일관된 진실 값이고 f, 그렇지 않으면 일관된 거짓 값입니다. 이것은 모든 "예"인스턴스는 동일한 진실 된 가치를 가져오고 모든 "아니오"인스턴스는 동일한 허위 가치를 초래한다는 것을 의미합니다.

입력 n = 2, M = [[0,1],[1,0]]및을 고려하십시오 L = [1,0,1,1]. 행렬 M은 이진 XOR 오토 마톤을 정의하며 f(a,b) = a+b mod 2시공간 다이어그램 L

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 01 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*_&,=

이것은 정의를 매우 간단하게 구현 한 것입니다. CJam 스타일 배열을 사용하여 STDIN에서 역순으로 입력을 예상합니다.

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

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]

진실

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.