Garip bir otomat uygulayın


11

Hücresel otomatla oynuyordum ve ilginç davranışları olan bir tane buldum. Şöyle çalışır:

Soldan sağa bir ikili dize okur, 1ardından 2başka değerlerle karşılaşırsa 0sonuca a ekler ve okumaya devam eder. Bir 0(veya 3 değerden daha az değer kaldı) ile karşılaşırsa, geçerli değeri ve a'yı ekler 1ve okumaya devam eder. Dizenin sonunda 1sonuca bir tek ekler .

İşte bir jenerasyonun çalışılmış bir örneği

01011111
^

Önce bir karşılaşmaya 0biz eklemek böylece 01bizim sonuca

01011111
 ^
01

Şimdi bir ile karşılaştık, 1sıfır ekledik ve sonraki iki değeri atladık

01011111
    ^
010

Başka biriyle karşılaşıyoruz, 1böylece aynısını yapıyoruz

01011111
       ^
0100

Artık 1atlamak için başka bir alanımız var, ancak atlamak için yeterli alanımız yok, bu yüzden mevcut hücreyi ve a 1(bu örnekte 11)

01011111
        ^
010011

Sonundayız, bu yüzden tek bir tane ekliyoruz 1ve bu nesli sonlandırıyoruz

01011111
        ^
0100111

Görev

Herhangi bir makul formatta girdi verildiğinde, otomatın bir neslini hesaplayan bir fonksiyon veya program oluşturmalısınız.

Bu bir sorusudur, bu nedenle cevaplar bayt cinsinden puanlandırılacak, daha az bayt daha iyi olacaktır.

Örnek uygulama

İşte Haskell'deki örnek bir uygulama (bir işlevi tanımlar d, ancak program süresiz olarak bir yineleme yazdırır):

d('1':_:_:x) = "0" ++ d x
d(a:x) = a:'1':d x
d x = "1"
r x = x:map d(r x)

Çevrimiçi deneyin!


Sorunuzda şu an başka bir 1 var ama atlamak için yeterli alanımız yok, bu yüzden mevcut hücreyi ve 1 veya 11'i ekliyoruz . 1 veya 11 mi?
caird coinheringaahing

2
Öyleyse elimizde varsa 10baskı yapmalı 11011mı? Birkaç test vakasının yardımcı olacağını düşünüyorum
nmjcman101

2
@WheatWizard Kuralların daha net bir açıklamasını, belki de bir tabloyu takdir ediyorum
Alexander - Reinstate Monica

2
Bunun aslında bir hücresel otomat olduğuna inanmıyorum, ama beni söyleyerek bir tanımla aydınlatmaktan çekinmeyin.
feersum

2
@feersum Gerçekten, hücre sayısını korumaz. Bu bir var sonlu durum dönüştürücü .
Ørjan Johansen

Yanıtlar:


5

V , 26 22 21 bayt

Normal ifadeleri birleştirerek 4 baytlık @CowsQuack'e teşekkürler! @ ØrjanJohansen, bazı regex kombinasyonlarına sahip başka bir bayt için.

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

Çevrimiçi deneyin!

Yerine birden çok kez kullanır ve sonunda 1 ekler. Çok süslü bir şey yok. İstenilen efekti elde etmek için remaps 1ve 0insert modunda bir versiyonum var , ancak biraz daha uzun.

(Çoklu değiştirme sürümü: Çevrimiçi deneyin! )


İkinci ve üçüncü Ó1ü0/&1ü\|
regex'ler

@Cowsquack dehası!
nmjcman101

Bu do bile daha kısa Ó./&1izledi Ó31/0.
Ørjan Johansen

3

JavaScript (ES6), 56 bayt

Girişi bir karakter dizisi olarak alır. Bir dize veya sayı döndürür1 boş bir dizi verilirse .

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

gösteri

Animasyonlu sürüm

Sabit giriş örnekleri: 0101, 010011111




2

Swift 3 , 147 bayt

@ Mr.Xcoder sayesinde -1

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])}

Ungolfed, yazdırma yerine değeri döndürme:

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]
}

1
Sen değiştirebilirsiniz 3<=s.countile 2<s.countiçin -1 bayt .
Bay Xcoder

@ Mr.Xcoder Teşekkürler! Ben de yerine 1girdi tespit edebilir0 < elementelement == 0
Alexander - Reinstate Monica

1

Python 2 , 81 bayt

Hem girdi hem de çıktı listelerdir (Outgolfer Erik sayesinde)

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]

Çevrimiçi deneyin!

Bazı durumlar

[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 bayt

Hem giriş hem de çıkış dizgidir (ilk çözüm)

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'

Çevrimiçi deneyin!

Bazı durumlar

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

Explication Bu simplily bir özyinelemeli yöntemin bir golf olduğunu.



@EriktheOutgolfer teşekkürler :)
mdahmoune

Oh, ve sen 1>Z[0]yerine yapabilirsin 0==Z[0].
Outgolfer Erik


0

Scala , 131 + 29 = 160 bayt

Bu, dizeyi aparametre olarak alan ve çıktıyı dize olarak döndüren bir işlevin içindedir .

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"

Bunu yapmak zorundayım import util.control.Breaks._, bu yüzden bu 28 bayt artı sondaki bir satır beslemesini eklemeliyim.

Çevrimiçi deneyin!


0

C # (.NET Core) , 108 bayt

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";}

Çevrimiçi deneyin!

Bir dize olarak girdi alınır ve bir dize çıktı olarak döndürülür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.