Ein Brainfuck-Derivat
Definieren wir eine einfache Brainfuck- ähnliche Programmiersprache. Es verfügt über ein bidirektionales Zellenband, und jede Zelle enthält ein Bit. Alle Bits sind anfänglich 0. Auf dem Band befindet sich ein sich bewegender Kopf, der sich anfänglich an Position 0 befindet. Ein Programm ist eine Zeichenfolge über den Zeichen <>01!
, die von links nach rechts mit der folgenden Semantik ausgeführt wird:
<
bewegt den Kopf einen Schritt nach links.>
bewegt den Kopf einen Schritt nach rechts.0
setzt 0 in die aktuelle Zelle.1
setzt 1 in die aktuelle Zelle.!
Kippt die aktuelle Zelle.
Da es keine Schleifen gibt, endet ein Programm mit n Zeichen nach genau n Schritten. Ein Programm ist langweilig, wenn alle Zellen am Ende der Ausführung 0 enthalten, und aufregend, wenn mindestens eine 1 vorhanden ist. Beachten Sie, dass die Größe des Bandes nicht angegeben ist. Je nach Implementierung kann sie also in beide Richtungen unendlich oder unendlich sein kreisförmig.
Ein Beispielprogramm
Betrachten Sie das Programm 1>>>!<<<<0>!>>>!
. Auf einem unendlichen Band läuft die Ausführung wie folgt ab:
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
Am Ende sind alle Zellen 0, daher ist dieses Programm langweilig. Lassen Sie uns nun dasselbe Programm auf einem kreisförmigen Band der Länge 4 ausführen.
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
Dieses Mal gibt es eine Zelle mit dem Wert 1, das Programm ist also aufregend! Wir sehen, ob ein Programm langweilig oder aufregend ist, hängt von der Größe des Bandes ab.
Die Aufgabe
Ihre Eingabe ist eine nicht leere Zeichenfolge <>01!
, die ein Programm in der obigen Programmiersprache darstellt. Ein Array von Zeichen ist auch ein akzeptables Eingabeformat. Das Programm ist garantiert langweilig, wenn es auf einem endlosen Band abgespielt wird. Ihre Ausgabe soll die Liste der Bandlängen sein, auf denen das Programm spannend ist. Beachten Sie, dass Sie das Programm nur auf Bändern testen müssen, die kürzer als die Programmlänge sind.
Die Lösung mit der niedrigsten Byteanzahl in jeder Sprache ist der Gewinner. Es gelten die Standardregeln für Code-Golf .
Testfälle
> : []
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!
?