Brainfuck, 579 바이트
,[<<+>>>>+<<[[<+>>+<-]++++++[>-------<-]>-[-[-[-[--------------[--[<+++++[>-----
-<-]>+[--[<<[-]>>-]]<]>[>>-<<<<<[-]<[<]<<<[<]>>>>>>>>[<]<-[+>]+[->+]>>>>+>[<-]<[
>+<-<]>]<]>[<<<[-]-[<]>>>>>>>>>>>[<]<<<<<<[<]<-[+>]+[-<+]<<<+<[>-<<<]>[-<+<]]]<]
>[+>[-<]<[<<]<[-]>>]]<]+>[-[<-]<[>+>+<<-<]<[-]>+>]<<[>-]>[,>]<]<+<[>]>[>>>[<<<<[
-<]<<<]>>>+>>>>[<<<<->>>>[>>>[-<]>>>>]]]>[<<<[<+[-->>]]>[-[.[-]]]>[<]>[<<++++++[
>+++++++<-]>+>>[<<.>>-]<<++>-[<.>-]+++[<+++++>-]+<<<<<<+>[<<[>->>>>>.[[-]<<<<]<<
<+>>>]>[->->>>>[-]]]<[->+[>>>>>]>>[<]<<<<<<<<[[-]<]>[++.[-]>>>>>>>]<]]>>]<[>>>>>
>>]+[-<<<<<[-]<<],]
서식 및 일부 주석 :
,
[
<<+>> >>+<<
[
[<+> >+<-]
++++++[>-------<-]
>-
[
not plus
-
[
not comma
-
[
not minus
-
[
not period
--------------
[
not less than
--
[
not greater than
<+++++[>------<-]>+
[
not open bracket
--
[
not close bracket
<<[-]>>-
]
]
<
]
>
[
greater than
>>-<<
<<<[-]<[<]<<<[<]
>>>>>>>>[<]
<-[+>]
+[->+]
>>>>+>[<-]
<[>+<-<]
>
]
<
]
>
[
less than
<<<[-]-[<]
>>>> >>>>>>>[<]
<<<<<<[<]
<-[+>]
+[-<+]
<<<+<[>-<<<]
>[-<+<]
]
]
<
]
>
[
minus
+>[-<]
<[<<]
<[-]>>
]
]
<
]
+>
[
plus
-[<-]
<[>+>+<<-<]
<[-]>+>
]
<<
[
comma or period or bracket
>-
]
>[,>]
<
]
comma or period or bracket or eof
<+<
[
start and end same cell
>
]
>
[
>>>
[
<<<<[-<]<<<
]
>>>+>>>>
[
start right of end
<<<<->>>>
[>>>[-<]>>>>]
]
]
>
[
<<<
[
<+[-->>]
]
>[-[.[-]]]
>[<]
>
[
<<++++++[>+++++++<-]>+>>
[<<.>>-]
<<++>-[<.>-]
+++[<+++++>-]
+<<<<< <+>
[
<<
[
go left
>->>>>>.
[[-]<<<<]
<<<+>>>
]
>
[
toggle left right
->->>>>[-]
]
]
<
[
toggle right left
->+[>>>>>]>>[<]
<<<<<<<<
[
[-]<
]
>
[
go right
++.[-]
>>>>>>>
]
<
]
]
>>
]
<[>>>>>>>]
+[-<<<<<[-]<<]
,
]
이것은 Keith Randall의 솔루션과 동일한 접근법을 사용하여 +-<>
시뮬레이션에 의해 모든 연속 시퀀스를 최적으로 축소합니다 . 예를 들어, +++>-<+>---<
가 ++++>----<
되고 >+<+<<+>+<->>>>
됩니다 +<+>>+>
.
온라인으로 사용해보십시오.
(시뮬레이션 된 셀의 절대 값이 256에 가까워지면 오버플로 문제가 발생합니다.)
전반적인 구조는
while not EOF:
while not EOF and next char not in ",.[]":
process char
print minified sequence (followed by the char in ",.[]" if applicable)
테이프는 7 셀 노드로 나뉩니다. 내부 루프의 시작 부분에서 메모리 레이아웃은
0 s 0 c 0 a b
여기서 s
start 셀의 부울 플래그이고 c
현재 문자이며 a
시뮬레이션 된 셀 값의 음수 부분 (1을 더한 값)이며 b
시뮬레이션 된 셀 값의 양수 부분입니다.
축소 된 시퀀스가 인쇄 될 때 메모리 레이아웃은
d n e 0 0 a b
여기서,는 d
방향에 대한 부울 플래그이다, a
및 b
전과이다 (하나의 인쇄 / 제로되어 있지만), 및 n
및 e
엔드 노드에 대해서만 제로이고; n
노드를 본 횟수와 관련이 e
있으며 내부 루프를 중단 한 char 값 (1을 더한 값)입니다.
원래 노드 당 추가 정보를 추적하는 것을 고려했습니다. 가장 왼쪽 및 가장 오른쪽 노드는 부울 플래그이며 시작 및 끝 노드와 관련된 노드의 위치입니다. 그러나 필요할 때 인접한 셀을보고 시작 노드를 찾기 위해 왼쪽 및 오른쪽 스캔을 수행하여이를 피할 수 있습니다.
축소 된 시퀀스를 인쇄하고 시뮬레이션 된 포인터를 이동하는 방법을 결정할 때 일반적인 접근 방식을 취할 수 있습니다. 시작 노드와 끝 노드가 동일한 경우 임의의 방향으로 끝 노드에서 멀리 이동하여 가장 왼쪽과 오른쪽에서 돌아서십시오. 시작 노드와 종료 노드가 동일한 경우 3 회, 그렇지 않으면 2입니다.
++>>++<<--
출력해야하며>>++<<
다루지 않았습니다. 더 많은 테스트 사례를 추가하십시오.