Um derivado de Brainfuck
Vamos definir uma linguagem de programação simples, do tipo Brainfuck . Possui uma fita bidirecional de células, e cada célula contém um bit. Todos os bits são inicialmente 0. Há uma cabeça móvel na fita, inicialmente na posição 0. Um programa é uma sequência sobre os caracteres <>01!
, executada da esquerda para a direita, com a seguinte semântica:
<
move a cabeça um passo para a esquerda.>
move a cabeça um passo para a direita.0
coloca 0 na célula atual.1
coloca 1 na célula atual.!
vira a célula atual.
Como não há loops, um programa de n caracteres termina após exatamente n etapas. Um programa é chato se todas as células contiverem 0 no final da execução e empolgante se houver pelo menos um 1. Observe que o tamanho da fita não está especificado; portanto, dependendo da implementação, ela pode ser infinita ou bidirecional. circular.
Um programa de exemplo
Considere o programa 1>>>!<<<<0>!>>>!
. Em uma fita infinita, a execução prossegue da seguinte maneira:
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
No final, todas as células são 0, então esse programa é chato. Agora, vamos executar o mesmo programa em uma fita circular de comprimento 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
Desta vez, há uma célula com o valor 1, então o programa é emocionante! Vemos que se um programa é chato ou excitante depende do tamanho da fita.
A tarefa
Sua entrada é uma seqüência de caracteres não vazia <>01!
que representa um programa na linguagem de programação acima. Uma matriz de caracteres também é um formato de entrada aceitável. É garantido que o programa seja entediante quando executado em uma fita infinita. Sua saída deve ser a lista de comprimentos de fita em que o programa é interessante. Observe que você só precisa testar o programa em fitas menores que a duração do programa.
A solução com a menor contagem de bytes em cada idioma é a vencedora. Aplicam-se as regras padrão de código de golfe .
Casos de teste
> : []
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!
?