セルオートマトンのシーケンスの特定


10

バックグラウンド

この課題のために、n-stateセルオートマトンf、状態セットから2つの数値{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)]

結果のリストの要素は元のリストより1つ少ないことに注意してください。時空図fから始まるは、L繰り返し適用して得られたリストのリストであるfL、リスト内の結果を収集します。最終的なリストの長さは1です。状態セットのすべての2要素リストが、時空間図のいくつかの行の連続したサブリストである場合、リストLはの識別シーケンスであると言います。これは、他の状態のCAがその正確な時空図を持たないという条件と同等です。fLn

入力

入力は、nx行n整数の行列ML長さが2以上の整数のリスト、およびオプションで数値nです。マトリックスがM定義n-state CA fによってf(a,b) = M[a][b](0ベースのインデックスを使用して)。これは、ことが保証されn > 0、そのMLのみ状態集合の要素を含みます{0, 1, ..., n-1}

出力

LCAの識別シーケンスである場合、出力は一貫した真の値fであり、それ以外の場合は一貫した偽の値になります。これは、すべての「はい」インスタンスは同じ真理値をもたらし、すべての「いいえ」インスタンスは同じ偽値をもたらすことを意味します。

入力を考えてみましょうn = 2M = [[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 00 11 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*_&,=

これは非常に簡単な定義の実装です(最初の試行の後に私はJakubeからインスピレーションを得ました)。CJamスタイルの配列を使用して、STDINで逆順の入力を期待します。

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

簡単な実装:すべてのペアを圧縮して見つけ、後で使用できるように記憶して、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.