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
++>>++<<--
ควรส่งออก>>++<<
และที่ไม่ครอบคลุม โปรดเพิ่มกรณีทดสอบเพิ่มเติม