Mengidentifikasi Urutan untuk Automata Seluler

10

Latar Belakang

Untuk keperluan tantangan ini, notomat seluler tingkat -hanyalah fungsi biner fyang mengambil dua angka dari negara ditetapkan {0, 1, ..., n-1}sebagai input, dan mengembalikan nomor lain dari yang ditetapkan sebagai output. Ini dapat diterapkan ke daftar jumlah panjang minimal 2 olehL = [x0, x1, x2, ..., xk-1]

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

Perhatikan bahwa daftar yang dihasilkan memiliki satu elemen lebih sedikit daripada yang asli. Sebuah diagram ruang-waktu dari fmulai dari Ladalah daftar daftar yang diperoleh dengan berulang kali menerapkan funtuk L, dan mengumpulkan hasil dalam daftar. Daftar akhir memiliki panjang 1. Kita mengatakan bahwa daftar Ladalah urutan pengidentifikasi untuk f, jika setiap daftar dua elemen di set negara adalah sublist yang berdekatan dari beberapa baris diagram ruangwaktu mulai dari L. Ini sama dengan kondisi bahwa tidak ada nCA lain-negara memiliki diagram ruangwaktu yang tepat.

Memasukkan

Input Anda adalah n-by- nmatriks bilangan bulat M, daftar bilangan bulat Lpanjang minimal 2, dan secara opsional nomor n. Matriks Mmendefinisikan n-state CA fdengan f(a,b) = M[a][b](menggunakan pengindeksan berbasis 0). Dijamin itu n > 0, dan itu Mdan Lhanya berisi elemen dari set negara {0, 1, ..., n-1}.

Keluaran

Output Anda akan menjadi nilai kebenaran yang konsisten jika Lmerupakan urutan pengidentifikasi untuk CA f, dan nilai palsu yang konsisten jika tidak. Ini berarti bahwa semua "ya" - keadaan menghasilkan nilai kebenaran yang sama, dan semua "tidak" - keadaan menghasilkan nilai palsu yang sama.

Contoh

Mempertimbangkan masukan n = 2, M = [[0,1],[1,0]]dan L = [1,0,1,1]. Matriks Mmendefinisikan otomat XOR biner f(a,b) = a+b mod 2, dan diagram ruangwaktu mulai dari Ladalah

1 0 1 1
1 1 0
0 1
1

Diagram ini tidak mengandung 0 0baris apa pun, jadi Lbukan urutan pengidentifikasi, dan output yang benar adalah False. Jika kita input L = [0,1,0,0]sebagai gantinya, diagram ruangwaktu adalah

0 1 0 0
1 1 0
0 1
1

Deretan diagram ini berisi semua pasangan yang diambil dari set negara, yaitu 0 0, 0 1, 1 0dan 1 1, sehingga Lmerupakan urutan mengidentifikasi dan output yang benar adalah True.

Aturan

Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.

Uji Kasus

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
sumber

Jawaban:

2

CJam, 53 43 42 byte

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

Ini adalah implementasi definisi yang sangat mudah (saya mengambil beberapa inspirasi dari Jakube setelah upaya pertama saya). Ia mengharapkan input dalam urutan terbalik pada STDIN, menggunakan array gaya CJam:

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

Berikut ini adalah test harness yang menjalankan kode terhadap semua input (mengubahnya terlebih dahulu ke format input yang benar). Hasil di bidang input tidak benar-benar digunakan. Hapus mereka jika Anda tidak percaya padaku. ;)

Martin Ender
sumber
5

Python 2: 93 byte

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

Implementasi langsung: Temukan semua pasangan dengan zip, hafalkan untuk nanti dan terapkan M ke L. Ulangi. Bandingkan jumlah pasangan unik yang ditemukan.

Input berupa formulir [[0,1],[1,0]], [0,1,0,0], 2.

Jakube
sumber
2

Mathematica, 90 83 82 byte

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

Implementasi lurus ke depan lainnya.

Pemakaian:

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

Benar

alephalpha
sumber