Thực hiện một máy tự động lạ


11

Tôi đang chơi xung quanh với máy tự động di động và tôi tìm thấy một trong đó có một số hành vi thú vị. Đây là cách nó hoạt động:

Nó đọc một chuỗi nhị phân từ trái sang phải, nếu nó gặp một giá trị 1tiếp theo, 2nó sẽ nối thêm 0vào kết quả và tiếp tục đọc. Nếu nó gặp một 0(hoặc còn ít hơn 3 giá trị), nó sẽ nối thêm giá trị hiện tại và a 1và tiếp tục đọc. Ở cuối chuỗi, nó sẽ nối thêm một 1kết quả.

Đây là một ví dụ về một thế hệ

01011111
^

Chúng tôi lần đầu tiên gặp phải 0vì vậy chúng tôi nối 01vào kết quả của chúng tôi

01011111
 ^
01

Bây giờ chúng tôi gặp phải 1vì vậy chúng tôi nối số 0 và bỏ qua hai giá trị tiếp theo

01011111
    ^
010

Chúng tôi gặp người khác 1nên chúng tôi cũng làm như vậy

01011111
       ^
0100

Bây giờ chúng ta có một 1khoảng trống khác nhưng không đủ để nhảy nên chúng ta nối thêm ô hiện tại và một 1(trong trường hợp này 11)

01011111
        ^
010011

Chúng tôi đang ở cuối nên chúng tôi nối thêm một 1và chấm dứt thế hệ này

01011111
        ^
0100111

Bài tập

Đưa ra đầu vào ở bất kỳ định dạng hợp lý nào, bạn phải tạo một hàm hoặc chương trình tính toán một thế hệ của máy tự động.

Đây là một câu hỏi vì vậy câu trả lời sẽ được tính bằng byte, với ít byte hơn sẽ tốt hơn.

Mẫu thực hiện

Dưới đây là một triển khai mẫu trong Haskell (xác định hàm d, nhưng chương trình in một lần lặp vô thời hạn):

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

Hãy thử trực tuyến!


Trong câu hỏi của bạn, bạn nêu rõ Bây giờ chúng tôi có thêm 1 nhưng không đủ không gian để nhảy nên chúng tôi nối thêm ô hiện tại và 1 hoặc 11 . Là 1 hay 11?
caird coinheringaahing

2
Vì vậy, nếu chúng ta có một 10nó nên in 11011? Tôi nghĩ rằng một vài trường hợp thử nghiệm sẽ hữu ích hơn
nmjcman101

2
@WheatWizard Tôi sẽ đánh giá cao một lời giải thích rõ ràng hơn, có lẽ là một bảng, về các quy tắc
Alexander - Tái lập Monica

2
Tôi không tin rằng đây thực sự là một máy tự động di động, nhưng hãy thoải mái khai sáng cho tôi với một định nghĩa nói rằng nó là.
frageum

2
@feersum Thật vậy, nó không bảo tồn số lượng tế bào. Đó là một bộ chuyển đổi trạng thái hữu hạn .
Ørjan Johansen

Câu trả lời:


5

V , 26 22 21 byte

Cảm ơn @CowsQuack cho 4 byte bằng cách kết hợp các biểu thức chính quy! Và @ rjanJohansen cho một byte khác với một số kết hợp regex.

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

Hãy thử trực tuyến!

Sử dụng thay thế nhiều lần và thêm 1 vào cuối. Không có gì quá lạ mắt. Tôi có một phiên bản ánh xạ lại 10ở chế độ chèn để có được hiệu ứng mong muốn, nhưng nó dài hơn một chút.

(Nhiều phiên bản thay thế: Dùng thử trực tuyến! )


Các Ó1ü0/&1ü\|
regex

@Cowsquack thiên tài!
nmjcman101

Nó thậm chí còn ngắn hơn để làm Ó./&1theo Ó31/0.
Ørjan Johansen

3

JavaScript (ES6), 56 byte

Đưa đầu vào như một mảng các ký tự. Trả về một chuỗi hoặc số 1nếu được cung cấp một mảng trống.

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

Bản giới thiệu

Phiên bản hoạt hình

Ví dụ về đầu vào ổn định: 0101, 010011111



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]

Hãy thử trực tuyến!

-4 byte nhờ vào Rod
-6 byte nhờ
các byte -1 byte nhờ micsthepick


[0]if v else[x[y],1]có thể được viết lại thành [[x[y],1],[0]][v], nhưng bạn có thể đảo ngược vgiá trị để đạt 96 byte
Rod


Không cần phải có dấu ngoặc đơn cho câu lệnh in trong python 2, vì vậy bạn có thể lưu một byte
micsthepick

2

Swift 3 , 147 byte

-1 cảm ơn @ 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])}

Ung dung, trả lại giá trị thay vì in:

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
Bạn có thể thay thế 3<=s.countbằng 2<s.countcho -1 byte .
Ông Xcoder

@ Mr.Xcoder Cảm ơn! Tôi cũng có thể phát hiện 1s trong đầu vào 0 < elementthay vìelement == 0
Alexander - Tái lập Monica

1

Python 2 , 81 byte

Cả đầu vào và đầu ra đều là danh sách (nhờ 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]

Hãy thử trực tuyến!

Một số trường hợp

[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

Cả đầu vào và đầu ra là các chuỗi (giải pháp ban đầu)

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'

Hãy thử trực tuyến!

Một số trường hợp

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

Giải thích Nó đơn giản là một golf của một phương pháp đệ quy.



@EriktheOutgolfer cảm ơn :)
mdahmoune 27/07/17

Oh, và bạn có thể làm 1>Z[0]thay vì 0==Z[0].
Erik the Outgolfer 27/07/17


0

Scala , 131 + 29 = 160 byte

Đây là bên trong một hàm lấy chuỗi alàm tham số và trả về đầu ra dưới dạng chuỗi.

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"

Tôi phải làm import util.control.Breaks._vậy, vì vậy tôi cần thêm 28 byte đó cộng với một dòng cấp dữ liệu.

Hãy thử trực tuyến!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.