Brainfuck衍生物
让我们定义一种类似于Brainfuck的简单编程语言。它有一个双向的单元格带,每个单元格容纳一位。所有位的起始位置均为0。磁带上的移动头起始位置为0。程序是一个在字符上的字符串<>01!
,从左到右执行,具有以下语义:
<
将头部向左移动一步。>
将头部向右移动一步。0
在当前单元格中放入0。1
在当前单元格中放入1。!
翻转当前单元格。
没有循环,因此n个字符的程序将在n个步骤之后终止。如果在执行结束时所有单元格都包含0,则程序很无聊,如果至少有1,则令人兴奋。请注意,未指定磁带的大小,因此,根据实现的不同,它可能是双向无限的或圆。
一个示例程序
考虑该程序1>>>!<<<<0>!>>>!
。在无限磁带上,执行如下:
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
最后,所有单元格均为0,因此该程序很无聊。现在,让我们在长度为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
这次有一个值为1的单元格,因此程序令人兴奋!我们看到程序是无聊还是令人兴奋,取决于磁带的大小。
任务
您的输入是一个非空字符串<>01!
,表示上述编程语言中的程序。字符数组也是可接受的输入格式。在无限磁带上运行时,该程序一定很无聊。您的输出将是程序令人兴奋的磁带长度列表。请注意,您只需要在比程序长度短的磁带上测试程序。
每种语言中字节数最少的解决方案是赢家。适用标准代码高尔夫球规则。
测试用例
> : []
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!
吗?