Một dẫn xuất Brainfuck
Hãy xác định một ngôn ngữ lập trình giống như Brainfuck . Nó có một băng hai chiều của các ô và mỗi ô giữ một bit. Tất cả các bit ban đầu là 0. Có một đầu di chuyển trên băng, ban đầu ở vị trí 0. Một chương trình là một chuỗi trên các ký tự <>01!
, được thực hiện từ trái sang phải, với các ngữ nghĩa sau:
<
di chuyển đầu một bước sang trái.>
di chuyển đầu một bước sang phải.0
đặt 0 trong ô hiện tại.1
đặt 1 trong ô hiện tại.!
lật các tế bào hiện tại.
Không có vòng lặp, vì vậy một chương trình gồm n ký tự kết thúc sau n bước chính xác . Một chương trình thật nhàm chán nếu tất cả các ô chứa 0 khi kết thúc thực thi và thú vị nếu có ít nhất một 1. Lưu ý rằng kích thước của băng không được chỉ định, do đó tùy thuộc vào việc triển khai, nó có thể là vô hạn hai chiều hoặc thông tư.
Một chương trình ví dụ
Hãy xem xét chương trình 1>>>!<<<<0>!>>>!
. Trên một băng vô hạn, việc thực hiện được tiến hành như sau:
v
00000000000000 Put 1
v
00000100000000 Move by >>>
v
00000100000000 Flip
v
00000100100000 Move by <<<<
v
00000100100000 Put 0
v
00000100100000 Move by >
v
00000100100000 Flip
v
00000000100000 Move by >>>
v
00000000100000 Flip
v
00000000000000
Cuối cùng, tất cả các ô đều bằng 0, vì vậy chương trình này thật nhàm chán. Bây giờ, hãy chạy cùng một chương trình trên một băng tròn dài 4.
v
0000 Put 1
v
1000 Move by >>>
v
1000 Flip
v
1001 Move by <<<< (wrapping around at the edge)
v
1001 Put 0
v
1000 Move by > (wrapping back)
v
1000 Flip
v
0000 Move by >>>
v
0000 Flip
v
0001
Lần này, có một ô có giá trị 1, vì vậy chương trình rất thú vị! Chúng tôi thấy rằng một chương trình nhàm chán hay thú vị phụ thuộc vào kích thước của băng.
Nhiệm vụ
Đầu vào của bạn là một chuỗi không trống <>01!
để biểu thị một chương trình bằng ngôn ngữ lập trình ở trên. Một mảng các ký tự cũng là một định dạng đầu vào chấp nhận được. Chương trình được đảm bảo là nhàm chán khi chạy trên một băng vô hạn. Đầu ra của bạn sẽ là danh sách các độ dài băng mà chương trình thú vị. Lưu ý rằng bạn chỉ cần kiểm tra chương trình trên các băng ngắn hơn thời lượng chương trình.
Giải pháp có số byte thấp nhất trong mỗi ngôn ngữ là người chiến thắng. Luật golf tiêu chuẩn được áp dụng.
Các trường hợp thử nghiệm
> : []
110 : []
1>0<! : [1]
0>>1>0<<>! : [1]
1>>>!<<<<0>!>>>! : [2, 4]
!<!<><<0>!>!<><1!>>0 : [2]
>>!>><>001>0<1!<<!>< : [1, 2, 3]
1!><<!<<<!!100><>>>! : [1, 3]
!!1>!>11!1>>0<1!0<!<1><!0<!<0> : [3, 4]
<><<>>!<!!<<<!0!!!><<>0>>>>!>> : [1, 2, 4]
0>>><!<1><<<0>!>>!<<!!00>!<>!0 : [3]
0000!!!!><1<><>>0<1><<><<>>!<< : []
!>!>!>!>!>1>!>0<!<!<!<0<!<0<!<!<!<1>!>0<<! : [1, 2, 5, 7]
<!!>!!><<1<>>>!0>>>0!<!>1!<1!!><<>><0<<!>><<!<<!>< : [1, 2, 4, 5]
!>1<<11<1>!>!1!>>>0!!>!><!!00<><<<0<<>0<<!<<<>>!!> : [1, 2, 3, 5, 6]
<>01!
?