Un dérivé de Brainfuck
Définissons un langage de programmation simple de type Brainfuck . Il a une bande de cellules bidirectionnelle et chaque cellule contient un bit. Tous les bits sont initialement 0. Il y a une tête mobile sur la bande, initialement à la position 0. Un programme est une chaîne sur les caractères <>01!
, exécutée de gauche à droite, avec la sémantique suivante:
<
déplace la tête d'un pas vers la gauche.>
déplace la tête d'un pas vers la droite.0
met 0 dans la cellule courante.1
met 1 dans la cellule courante.!
retourne la cellule actuelle.
Il n'y a pas de boucles, donc un programme de n caractères se termine après exactement n étapes. Un programme est ennuyeux si toutes les cellules contiennent 0 à la fin de l'exécution et excitant s'il y en a au moins un. circulaire.
Un exemple de programme
Considérez le programme 1>>>!<<<<0>!>>>!
. Sur une bande infinie, l'exécution se déroule comme suit:
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
À la fin, toutes les cellules sont à 0, donc ce programme est ennuyeux. Maintenant, exécutons le même programme sur une bande circulaire de longueur 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
Cette fois, il y a une cellule de valeur 1, donc le programme est passionnant! Nous voyons que si un programme est ennuyeux ou excitant dépend de la taille de la bande.
La tâche
Votre entrée est une chaîne non vide <>01!
qui représente un programme dans le langage de programmation ci-dessus. Un tableau de caractères est également un format d'entrée acceptable. Le programme est garanti d'être ennuyeux lorsqu'il est exécuté sur une bande infinie. Votre sortie sera la liste des longueurs de bande sur lesquelles le programme est passionnant. Notez que vous devez uniquement tester le programme sur des bandes plus courtes que la longueur du programme.
La solution avec le nombre d'octets le plus bas dans chaque langue est la gagnante. Les règles de code-golf standard s'appliquent.
Cas de test
> : []
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!
?