인코딩 알고리즘
개요
인코더는 각 바이트를 brainfuck 코드로 변환합니다. 단순히 +를 N번 반복하는 대신, 중첩 루프를 이용한 곱셈으로 코드 길이를 최적화합니다.
증분 인코딩
연속된 바이트 간의 차이값만 인코딩합니다.
예를 들어 Hi(72, 105)를 인코딩하면:
- 첫 번째 바이트: 0 → 72, 차이 = 72
- 두 번째 바이트: 72 → 105, 차이 = 33
두 번째 바이트는 72가 아닌 33만큼만 증가시키면 되므로 코드가 짧아집니다.
차이가 음수(값이 감소)이면 + 대신 -를 사용합니다.
depth 계산
차이값 c에 대해 최적의 루프 깊이(depth)를 계산합니다.
depth = 1 (c < 8일 때)
depth = c^(1/8) + 1 (c >= 8일 때)
depth = 1: 루프 없이+/-를 직접 나열depth = 2: 1단 루프 (예:+++++[>++++<-]>++.)depth = 3: 2단 중첩 루프
생성되는 코드 구조 (depth=2 예시)
차이값 c를 a * b + r로 분해합니다 (a는 c의 제곱근 근사치).
+++...+++ [> +++...+++ <-]> ++...++ .
|-- a개 --| |-- b개 --| |- r개-|
- 보조 셀에
a를 세팅 - 루프: 메인 셀에
b를 더하고, 보조 셀을 1 감소 - 루프 종료 후 나머지
r을 보정 .으로 출력
이렇게 하면 a + b + r개의 명령어로 a * b + r 크기의 값을 만들 수 있습니다.