Menerapkan otomat aneh

11

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 1diikuti oleh 2nilai-nilai lain itu akan menambahkan 0ke hasil dan melanjutkan membaca. Jika bertemu dengan 0(atau ada kurang dari 3 nilai yang tersisa) itu akan menambahkan nilai saat ini dan a 1dan melanjutkan membaca. Pada akhir string itu akan menambahkan satu 1ke hasil.

Berikut adalah contoh satu generasi yang berhasil

01011111
^

Kami pertama kali bertemu 0sehingga kami menambahkan 01ke hasil kami

01011111
 ^
01

Sekarang kita temui a 1sehingga kami menambahkan nol dan melewatkan dua nilai berikutnya

01011111
    ^
010

Kami bertemu orang lain 1sehingga kami melakukan hal yang sama

01011111
       ^
0100

Kami sekarang memiliki ruang lain 1tetapi 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 1dan 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 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)

Cobalah online!

Ad Hoc Garf Hunter
sumber
Dalam pertanyaan Anda, Anda menyatakan Kami sekarang memiliki 1 lagi tetapi tidak cukup ruang untuk melompat sehingga kami menambahkan sel saat ini dan 1 atau 11 . Apakah 1 atau 11?
caird coinheringaahing
2
Jadi kalau kita punya 10harus cetak 11011? Saya pikir beberapa kasus uji lagi akan membantu
nmjcman101
2
@WheatWizard Saya akan sangat menghargai penjelasan yang lebih jelas, mungkin sebuah tabel, dari aturan
Alexander - Reinstate Monica
2
Saya tidak percaya ini sebenarnya merupakan otomat seluler, tetapi merasa bebas untuk mencerahkan saya dengan definisi yang mengatakan itu.
feersum
2
@feersum Memang, itu tidak mempertahankan jumlah sel. Ini adalah transduser berhingga .
Ørjan Johansen

Jawaban:

5

V , 26 22 21 byte

Berkat @CowsQuack selama 4 byte dengan menggabungkan regex! Dan @ ØrjanJohansen untuk byte lain dengan beberapa kombinasi regex.

Ó1../3
Ó./&1
Ó31/0
A1

Cobalah online!

Gunakan pengganti beberapa kali dan tambahkan 1 di bagian akhir. Tidak ada yang terlalu mewah. Saya memiliki versi yang memetakan kembali 1dan 0dalam mode penyisipan untuk mendapatkan efek yang diinginkan, tetapi ini sedikit lebih lama.

(Versi pengganti banyak: Coba online! )

nmjcman101
sumber
Ó1ü0/&1ü\|
Regex
@Cowsquack genius!
nmjcman101
Bahkan lebih pendek untuk Ó./&1diikuti Ó31/0.
Ørjan Johansen
3

JavaScript (ES6), 56 byte

Mengambil input sebagai array karakter. Mengembalikan string, atau nomor 1jika diberi array kosong.

f=([v,...a])=>v?(+v&&a[1]?a.splice(0,2)&&'0':v+1)+f(a):1

Demo

Versi animasi

Contoh input stabil: 0101, 010011111

Arnauld
sumber
2

Python 2 , 88 byte

I,r=input(),[]
while I:a=I[0]and len(I)>2;b=a<1;r+=[I[0]]*b+[+b];I=I[a*2+1:]
print r+[1]

Cobalah online!

Erik the Outgolfer
sumber
2

Python 2 , 89 byte

x=input()
y=0
k=[]
while x[y:]:v=1-x[y]*(y<len(x)-2);k+=[x[y]]*v+[v];y+=3-2*v
print k+[1]

Cobalah online!

-4 byte terima kasih kepada Rod
-6 byte terima kasih kepada ovs
-1 byte terima kasih kepada micsthepick

HyperNeutrino
sumber
[0]if v else[x[y],1]dapat ditulis ulang sebagai [[x[y],1],[0]][v], tetapi Anda dapat membalikkan vnilai untuk mencapai 96 byte
Rod
90 byte
ovs
Tanda kurung tidak diperlukan untuk pernyataan cetak dalam python 2, sehingga Anda dapat menyimpan satu byte
micsthepick
2

Swift 3 , 147 byte

-1 berkat @ Mr.Xcoder

func g(i:[Int]){var r=[Int]();var s=ArraySlice(i);while let e=s.popFirst(){if 0<e&&2<s.count{r+=[0];s=s.dropFirst(2)}else{r+=[e,1]}};print(r+[1])}

Tidak digabungkan, mengembalikan nilai alih-alih mencetak:

func iterate(state: [Int]) -> [Int] {
    var result = [Int]()

    var inputSlice = ArraySlice(state)

    while let element = inputSlice.popFirst() {
        if 0 < element && 2 < inputSlice.count { 
            result += [0]
            inputSlice = inputSlice.dropFirst(2)
        }
        else {
            result += [element, 1]
        }

        //debugPrint(result.map(String.init).joined(separator: ""))
    }

    return result + [1]
}
Alexander - Pasang kembali Monica
sumber
1
Anda dapat mengganti 3<=s.countdengan 2<s.countuntuk -1 byte .
Tn. Xcoder
@ Mr.Xcoder Terima kasih! Saya juga dapat mendeteksi 1input dengan 0 < elementdaripadaelement == 0
Alexander - Reinstate Monica
1

Python 2 , 81 byte

Baik input dan output adalah daftar (terima kasih kepada Erik the Outgolfer)

def f(Z):return Z and((1>Z[0]or 3>len(Z))and[Z[0],1]+f(Z[1:])or[0]+f(Z[3:]))or[1]

Cobalah online!

Beberapa kasus

[0,1,0,1,1,1,1,1] --> [0,1,0,0,1,1,1]
[0] ----------------> [0,1,1]
[1] ----------------> [1,1,1]
[] -----------------> [1]
[0,1] --------------> [0,1,1,1,1]
[1,0] --------------> [1,1,0,1,1]

Python 2 , 85 byte

Baik input maupun output adalah string (solusi awal)

def f(Z):return Z and(('0'==Z[0]or 3>len(Z))and Z[0]+'1'+f(Z[1:])or'0'+f(Z[3:]))or'1'

Cobalah online!

Beberapa kasus

'01011111'--> 0100111
'0'---------> 011
'1'---------> 111
''----------> 1
'01'--------> 01111
'10'--------> 11011

Penjelasan Ini sederhana golf dari metode rekursif.

mdahmoune
sumber
Menggunakan daftar lebih pendek.
Erik the Outgolfer
@EriktheOutgolfer terima kasih :)
mdahmoune
Oh, dan Anda dapat melakukan 1>Z[0]bukan 0==Z[0].
Erik the Outgolfer
0

Scala , 131 + 29 = 160 byte

Ini di dalam fungsi mengambil string asebagai parameter dan mengembalikan output sebagai string.

var s=""
var k=0
for(c<-0 to a.length-1)breakable{if(k>0){k-=1
break}
if(a(c)==49&c<a.length-3){s+="0"
k+=2}else s+=a(c)+"1"}
s+"1"

Saya harus melakukannya import util.control.Breaks._, jadi saya perlu menambahkan 28 byte tersebut ditambah linefeed tambahan.

Cobalah online!

V. Courtois
sumber
0

C # (.NET Core) , 108 byte

n=>{var t="";for(int i=0,b=n.Length;i<b;){if(n[i]>'0'&i+2<b){t+="0";i+=3;}else t+=n[i++]+"1";}return t+"1";}

Cobalah online!

Input diambil sebagai string, dan string dikembalikan sebagai output.

jkelm
sumber