奇妙なオートマトンを実装する


11

私はセルオートマトンで遊んでいて、いくつかの興味深い動作をしているものを見つけました。仕組みは次のとおりです。

バイナリ文字列を左から右に読み取ります。1その後に2他の値が続く場合0、結果にa を追加して読み取りを続けます。に遭遇した場合0(または、残っている値が3つ未満の場合)、現在の値とaを追加して1読み取りを続行します。文字列の最後1に、結果にシングルを追加します。

これは、1世代の解決例です

01011111
^

最初に遭遇する0ので01、結果に追加します

01011111
 ^
01

ここでa 1が発生したため、ゼロを追加して次の2つの値をスキップします

01011111
    ^
010

私たちは別の1ものに遭遇するので、同じことをします

01011111
       ^
0100

現在1、ジャンプするのに十分ではない別のスペースがあるので、現在のセルと1(この場合は11)を追加します

01011111
        ^
010011

最後にいるので、単一を追加して1この世代を終了します

01011111
        ^
0100111

仕事

任意の妥当な形式の入力を指定すると、オートマトンの1世代を計算する関数またはプログラムを作成する必要があります。

これは質問なので、回答はバイト単位で記録され、バイト数は少ない方が良いでしょう。

サンプル実装

Haskellのサンプル実装を次に示します(関数を定義しますdが、プログラムは無限に繰り返しを出力します)。

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

オンラインでお試しください!


あなたの質問では、ジャンプするためのスペースが不足しているため、現在のセルと1または11を追加します。1または11ですか?
コヒーリングケアリング

2
それで、もし持って10いるなら、印刷すべき11011でしょうか?さらにいくつかのテストケースが役立つと思います
-nmjcman101

2
@WheatWizard私はルールのより明確な説明、おそらく表をいただければ幸いです
アレクサンダー-モニカーの復活

2
私はこれが実際にセルオートマトンであるとは思わないが、それがそうであるという定義で私に教えてください。
-feersum

2
@feersum実際、セルの数は保持されません。それは有限状態のトランスデューサです。
Ørjanヨハンセン

回答:


5

V26 22 21バイト

正規表現を組み合わせて4バイトの@CowsQuackをありがとう!@ØrjanJohansenには、いくつかの正規表現の組み合わせを持つ別のバイトがあります。

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

オンラインでお試しください!

置換を複数回使用し、末尾に1を追加します。派手なものは何もありません。目的の効果を得るために、再マップ10て挿入モードにしたバージョンがありますが、かなり長くなります。

(複数の代替バージョン:オンラインでお試しください!


2番目と3番目の正規表現をマージできるÓ1ü0/&1üis \|
-user41805

@Cowsquack天才!
nmjcman101

それにÓ./&1続いてを実行するとさらに短くなりますÓ31/0
Ørjanヨハンセン

3

JavaScript(ES6)、56バイト

入力を文字の配列として受け取ります。文字列、または1空の配列が指定されている場合は数値を返します。

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

デモ

アニメーション版

安定した入力の例:0101、010011111



2

Python 2、89バイト

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]

オンラインでお試しください!

Rodのおかげで-4バイト
ovsのおかげで-6バイト
micsthepickのおかげで-1バイト


[0]if v else[x[y],1]以下のように書き換えることができ[[x[y],1],[0]][v]ますが、あなたは反転することができv到達する値を96バイト
ロッド


python 2のprintステートメントには括弧が必要ないため、1バイト節約できます
-micsthepick

2

Swift 3、147バイト

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

Ungolfed、印刷ではなく値を返します:

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
あなたは置き換えることができ3<=s.count2<s.countために-1バイト
ミスターXcoder

@ Mr.Xcoderありがとう!私はまた、検出した可能1で、入力中のSを0 < elementよりむしろelement == 0
復活モニカ-アレクサンダー

1

Python 2、81バイト

入力と出力の両方がリストです(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]

オンラインでお試しください!

ある場合

[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バイト

入力と出力の両方が文字列です(初期ソリューション)

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'

オンラインでお試しください!

ある場合

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

解明それはsimplily再帰的な方法でのゴルフです。



@EriktheOutgolferありがとう:)
mdahmoune

ああ、1>Z[0]代わりにできます0==Z[0]
エリックアウトゴルファー


0

Scala、131 + 29 = 160バイト

これはa、パラメータとして文字列を取り、文字列として出力を返す関数内にあります。

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"

私がしなければならないのimport util.control.Breaks._私は、これらの28のバイトプラス末尾に改行を追加する必要があるので、。

オンラインでお試しください!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.