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ị 1
tiếp theo, 2
nó sẽ nối thêm 0
và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 1
và tiếp tục đọc. Ở cuối chuỗi, nó sẽ nối thêm một 1
kế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 0
vì vậy chúng tôi nối 01
vào kết quả của chúng tôi
01011111
^
01
Bây giờ chúng tôi gặp phải 1
vì 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 1
nên chúng tôi cũng làm như vậy
01011111
^
0100
Bây giờ chúng ta có một 1
khoả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 1
và 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 golf-code 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)
10
nó 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