brainfuck、226バイト
,[<<<,]+[>>->[[[[>>[>>>]<+<-<[<<<]>>+<-]>[<+>-]>[>>>]<<[>[<+>-]]>[[<+>-]>+[<<<]>
>>-[+>[<<<]<[>+>[->]<<[<]>-]>[<+>>+<-]>>>[>>>]]>>]<]>+[,<<<+]->[<<<]>>>>>+[,+>>>
+]-[>>>]->]<[+<<<]+<<<++[->>>]+>>>->]<[,<<<]<[>>>+<<<-]>+>,>>>]<<.
フォーマット済み:
,[<<<,]
+
[
for each suffix
>>->
[
for each prefix
[
for each suffix
[
for each char while no mismatch
[
>>[>>>]
<+<-<[<<<]
> >+<-
]
>[<+>-]
>[>>>]
<<
[
mismatch
>[<+>-]
]
>
[
[<+>-]
>+[<<<]
>>>-
[
match
+>[<<<]
<
[
>+>[->]
<<[<]
>-
]
>[<+> >+<-]
>>>[>>>]
]
>>
]
<
]
>+[,<<<+]
->[<<<]
>>> >>+[,+>>>+]
-[>>>]
->
]
<[+<<<]
+<<<++[->>>]
+>>>->
]
<[,<<<]
<[>>>+<<<-]
>+>,>>>
]
<<.
末尾の改行の有無にかかわらず入力を期待し、結果をバイト値として出力します。
オンラインでお試しください。
これにより、各プレフィックスが文字列の後半で発生するかどうかが確認され、最初の文字が切り取られ、残りの文字がなくなるまでプロセスが繰り返されます。
テープは3セルのノードに分割され、
c 0 f
where c
は、指定された文字列の文字でありf
、1、負の1、またはゼロのいずれかのフラグです。現在比較されている2つの文字の間にゼロ以外のフラグが配置され、負のフラグは現在のプレフィックスの末尾から現在のサフィックスの先頭まで(つまり、現在の一致のインデックスの前)に予約されます。
結果は文字列の左側に保存され、一致が見つかるたびに更新されます。
(文字列は、実際には逆に\x01
追加されて処理されます。)