Saya bermain-main dengan automaton seluler dan saya menemukan satu yang memiliki perilaku menarik. Begini cara kerjanya:
Bunyinya string biner dari kiri ke kanan, jika menjumpai 1
diikuti oleh 2
nilai-nilai lain itu akan menambahkan 0
ke hasil dan melanjutkan membaca. Jika bertemu dengan 0
(atau ada kurang dari 3 nilai yang tersisa) itu akan menambahkan nilai saat ini dan a 1
dan melanjutkan membaca. Pada akhir string itu akan menambahkan satu 1
ke hasil.
Berikut adalah contoh satu generasi yang berhasil
01011111
^
Kami pertama kali bertemu 0
sehingga kami menambahkan 01
ke hasil kami
01011111
^
01
Sekarang kita temui a 1
sehingga kami menambahkan nol dan melewatkan dua nilai berikutnya
01011111
^
010
Kami bertemu orang lain 1
sehingga kami melakukan hal yang sama
01011111
^
0100
Kami sekarang memiliki ruang lain 1
tetapi tidak cukup untuk melompat sehingga kami menambahkan sel saat ini dan 1
(dalam hal ini 11
)
01011111
^
010011
Kami berada di akhir jadi kami menambahkan satu 1
dan mengakhiri generasi ini
01011111
^
0100111
Tugas
Masukan yang diberikan dalam format apa pun yang masuk akal Anda harus membuat fungsi atau program yang menghitung satu generasi automaton.
Ini adalah pertanyaan kode-golf sehingga jawaban akan dinilai dalam byte, dengan lebih sedikit byte yang lebih baik.
Implementasi sampel
Berikut ini adalah contoh implementasi di Haskell (mendefinisikan suatu fungsi d
, tetapi program mencetak iterasi tanpa batas waktu):
d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)
10
harus cetak 11011
? Saya pikir beberapa kasus uji lagi akan membantu