Brainfuck, 157 바이트
,+>-[>++<-----]>----->>+<<<<[->>[[->>[>>>]<+<+<[<<<]>>[>>>]<]>>[>>>]<[-<<[<<<]>>[>>>]<+>>[>>>]<]+>+<<<[<<<]>>[>>>]+[>>>]<]<<<+>>[<-<<]<]>>>>[>>>]<<<<<<[<<.<]
입력은 이진수로 제공됩니다.
기본 아이디어는 현재 시퀀스를 반복적으로 복제하고 ( "a"로 시작) 각 반복 후에 마지막 요소를 증가시키는 것입니다.
a → aa → ab
ab → abab → abac
abac → abacabac → 아 바카 박
...
이 모든 작업이 지정된 횟수만큼 완료되면 마지막 요소를 제외한 결과가 인쇄됩니다.
심층적 인 설명
메모리는 다음과 같은 방식으로 배열됩니다.
.---------.-.-----.----.---.-----.----.---.---
|Countdown|0|Value|Copy|End|Value|Copy|End|...
'---------'-'-----'----'---'-----'----'---'---
|--Element 1---|--Element 2---|
카운트 다운 에는 아직 실행되지 않은 복사주기 수가 있습니다. ABACABA 서열은 각각 3 개의 세포로 구성된 인접 블록에 저장된다. 값 은 요소의 문자를 보유합니다 (예 : "A", "B", "C"...). 복사 플래그는 해당 요소 (0 = 1 = 그렇지, 복사) 현재의 복사 사이클 내에서 복사 할 필요가 있는지 여부를 나타냅니다. 끝 이 복사되는 동안 플래그가 마지막 요소를 0으로 설정 (다른 모든 경우에 1이다).
이제 실제 (약간 ungolfed) 프로그램으로 :
, 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)