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แฟล็กบูลีนสำหรับเซลล์เริ่มต้นcคืออักขระปัจจุบันaเป็นส่วนลบของมูลค่าเซลล์จำลอง (บวกหนึ่ง) และbเป็นส่วนบวกของมูลค่าเซลล์จำลอง
เมื่อลำดับขั้นต่ำกำลังถูกพิมพ์รูปแบบหน่วยความจำคือ
d n e 0 0 a b
โดยที่dเป็นแฟล็กบูลีนสำหรับทิศทางaและbเป็นเหมือนก่อน (แต่จะกลายเป็นหนึ่ง / ศูนย์เมื่อพิมพ์) และnและไม่eเป็นศูนย์สำหรับโหนดสิ้นสุดเท่านั้น nเกี่ยวข้องกับจำนวนครั้งที่โหนดถูกมองเห็นและeเป็นค่าของถ่านที่หยุดวงภายใน (บวกหนึ่ง)
เดิมทีฉันพิจารณาการติดตามข้อมูลเพิ่มเติมต่อโหนด: โหนดด้านซ้ายและขวาสุดเป็นแฟล็กบูลีนและตำแหน่งของโหนดที่สัมพันธ์กับโหนดเริ่มต้นและสิ้นสุด แต่เราสามารถหลีกเลี่ยงสิ่งนั้นได้โดยดูที่เซลล์ข้างเคียงเมื่อต้องการและทำการสแกนทางซ้ายและขวาเพื่อหาจุดเริ่มต้น
เมื่อพิมพ์ลำดับที่ย่อและตัดสินใจว่าจะย้ายตัวชี้แบบจำลองได้อย่างไรเราสามารถใช้วิธีการทั่วไป: เริ่มต้นด้วยการย้ายออกจากโหนดปลาย (ในทิศทางใดก็ได้ถ้าโหนดเริ่มต้นและโหนดสิ้นสุดเหมือนกัน) หันไปทางซ้ายสุดและขวาสุด โหนดและหยุดตามจำนวนครั้งที่โหนดปลายทางถูกมองเห็น: 3 ครั้งหากโหนดเริ่มต้นและโหนดสิ้นสุดเหมือนกันมิฉะนั้น 2
++>>++<<--ควรส่งออก>>++<<และที่ไม่ครอบคลุม โปรดเพิ่มกรณีทดสอบเพิ่มเติม