Производная 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!
?