Sistem tag siklik adalah model komputasi Turing-complete kecil yang terdiri dari alfabet dua simbol (saya akan menggunakan {0,1}
), daftar produksi siklik terbatas hingga kosong yang terdiri dari dua simbol tersebut, dan kata tak terikat yang juga terdiri dari dua simbol itu.
Di setiap langkah:
- elemen pertama dalam kata tersebut dihapus
- jika itu produksi
0
saat ini dilewati - jika itu produksi
1
saat ini ditambahkan ke akhir kata . - produksi selanjutnya menjadi aktif. Jika ini adalah produksi terakhir, kembali ke yang pertama.
Sistem berhenti ketika kata menjadi kosong.
Contoh (dari Wikipedia):
Productions: (010, 000, 1111)
Initial word: 11001
Generation Production Word (before) Word (after)
0 010 11001 → 1001010
1 000 1001010 → 001010000
2 1111 001010000 → 01010000
3 010 01010000 → 1010000
4 000 1010000 → 010000000
5 1111 010000000 → 10000000
6 010 10000000 → 0000000010
7 000 0000000010 → 000000010
8 1111 000000010 → 00000010
9 010 00000010 → 0000010
Tugas Anda, jika Anda memilih untuk menerimanya, adalah menulis program atau fungsi yang membutuhkan:
- daftar produksi,
- kata awal, dan
- sebuah generasi,
dan mencetak atau mengembalikan kata pada generasi itu.
Sebagai contoh,
cyclic_tag(
prod=[[0,1,0],[0,0,0],[1,1,1,1]],
word=[1,1,0,0,1],
gen=4) => [1,0,1,0,0,0,0]
Detail implementasi:
Alfabet tidak masalah. Anda dapat menggunakan
0
dan1
,True
danFalse
,T
danNIL
,A
danB
, atau bahkan1
dan0
, atau apa pun yang Anda buat, selama Anda konsisten. Semua input dan output harus menggunakan alfabet yang sama, dan Anda harus menunjukkan untuk0
apa dan untuk apa1
.Panjang kata harus secara teoritis tidak terbatas. Artinya, Anda tidak boleh meng-hardcode panjang kata maksimum. Jika saya menjalankan program Anda pada komputer ideal dengan jumlah memori tak terbatas, program Anda secara teoritis harus dapat memanfaatkannya. (Anda dapat mengabaikan batas juru bahasa / kompiler Anda.)
Jika sistem yang diberikan berhenti sebelum generasi yang diberikan tercapai, Anda harus mengembalikan atau mencetak kata yang kosong.
Produksi kosong ada, dan Anda harus dapat mengatasinya. Jika Anda menulis program lengkap, I / O Anda juga harus bisa menanganinya.
Sunting : Saya awalnya bermaksud agar generasi 0
menjadi kata input itu sendiri, dan generasi 1
menjadi hasil dari langkah pertama. Yaitu, saya bermaksud agar Anda mengembalikan kolom sebelumnya . Namun , karena saya belum cukup jelas dalam menyatakan ini, saya akan menerima kedua opsi ; untuk setiap generasi Anda dapat mengembalikan nilai di kolom sebelum atau sesudah . Anda harus menyatakan bahwa Anda mengikuti kolom setelah , jika Anda melakukannya. Anda juga harus konsisten di kolom mana yang Anda pilih.
Saya akan memberikan kode terkecil seminggu dari sekarang (27/10/2014).