Brainfuck, 157 ไบต์
,+>-[>++<-----]>----->>+<<<<[->>[[->>[>>>]<+<+<[<<<]>>[>>>]<]>>[>>>]<[-<<[<<<]>>[>>>]<+>>[>>>]<]+>+<<<[<<<]>>[>>>]+[>>>]<]<<<+>>[<-<<]<]>>>>[>>>]<<<<<<[<<.<]
การป้อนข้อมูลจะได้รับในไบนารี
แนวคิดพื้นฐานคือการทำซ้ำลำดับปัจจุบันซ้ำ (เริ่มต้นด้วย "a") และเพิ่มองค์ประกอบสุดท้ายหลังจากการวนซ้ำแต่ละครั้ง:
a → aa → ab
ab → abab → abac
abac → abacabac → abacabac
...
เมื่อทั้งหมดนี้เสร็จสิ้นตามระยะเวลาที่กำหนดผลลัพธ์จะถูกพิมพ์โดยไม่รวมองค์ประกอบสุดท้าย
คำอธิบายในเชิงลึก
หน่วยความจำถูกจัดเรียงตามวิธีต่อไปนี้:
.---------.-.-----.----.---.-----.----.---.---
|Countdown|0|Value|Copy|End|Value|Copy|End|...
'---------'-'-----'----'---'-----'----'---'---
|--Element 1---|--Element 2---|
นับถอยหลังถือจำนวนรอบการคัดลอกที่ยังไม่ได้ดำเนินการ ลำดับ ABACABA จะถูกเก็บไว้ในบล็อก adjecent แต่ละเซลล์ประกอบด้วย 3 เซลล์ Valueถืออักขระขององค์ประกอบ (เช่น "A", "B", "C" ... ) การตั้งค่าสถานะการคัดลอกบ่งชี้ว่าองค์ประกอบที่เกี่ยวข้องต้องถูกคัดลอกภายในรอบการคัดลอกปัจจุบัน (0 = คัดลอก, 1 = ไม่) การตั้งค่าสถานะสิ้นสุดถูกตั้งค่าเป็น 0 สำหรับองค์ประกอบสุดท้ายในขณะที่กำลังถูกคัดลอก (เป็น 1 ในกรณีอื่นทั้งหมด)
ตอนนี้ถึงโปรแกรม (ไม่ได้รับการปรับเล็กน้อย) จริง:
, read Countdown from input
+ add 1 to avoid off-by-one error
>-[>++<-----]>----- initialize value cell of first element to 97 ("a")
>>+ set End flag of first element to 1
<<<< move to Countdown
[ loop until Countdown hits 0 (main loop)
- decrement Countdown
>> move to Value cell of first element
[ copying loop
[ duplication sub-loop
- decrement Value cell of the element to copy
>> move to End flag
[>>>] move to End flag of the last element
<+<+ increment Copy and Value cell of last element (Copy cell is temporarily abused)
< move to End flag of second to last element
[<<<]>> move back to Copy cell of first element
[>>>]< move to Value cell of the first element where the Copy flag is 0
]
>>[>>>]< move to (abused) Copy flag of the last element
[ "copy back" sub-loop
- decrement Copy flag
<< move to End flag of second to last element
[<<<]>> move back to Copy cell of first element
[>>>]< move to Value cell of the first element where the Copy flag is 0
+ increment Value cell
>>[>>>]< move back to Copy flag of the last element
]
+>+ set Copy and End flag to 1
<<< move to End flag of second to last element
[<<<]>> move back to Copy cell of first element
[>>>]< move to Value cell of the first element where the Copy flag is 0
>+< set Copy flag to 1
>[>>>]< move to Value cell of the next element to copy
] loop ends three cells behind the last "valid" Value cell
<<<+ increment Value cell of last element
>> move to End flag
[<-<<] reset all Copy flag
< move to Countdown
]
>>>> move to End flag of first element
[>>>]<<< move to End flag of last element
<<< skip the last element
[<<.<] output Value cells (in reverse order, but that doesn't matter)