콘텐츠로 이동

인코딩 알고리즘

개요

인코더는 각 바이트를 brainfuck 코드로 변환합니다. 단순히 +를 N번 반복하는 대신, 중첩 루프를 이용한 곱셈으로 코드 길이를 최적화합니다.

증분 인코딩

연속된 바이트 간의 차이값만 인코딩합니다.

예를 들어 Hi(72, 105)를 인코딩하면:

  1. 첫 번째 바이트: 0 → 72, 차이 = 72
  2. 두 번째 바이트: 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 예시)

차이값 ca * b + r로 분해합니다 (a는 c의 제곱근 근사치).

+++...+++ [> +++...+++ <-]> ++...++ .
|-- a개 --|  |-- b개 --|    |- r개-|
  1. 보조 셀에 a를 세팅
  2. 루프: 메인 셀에 b를 더하고, 보조 셀을 1 감소
  3. 루프 종료 후 나머지 r을 보정
  4. .으로 출력

이렇게 하면 a + b + r개의 명령어로 a * b + r 크기의 값을 만들 수 있습니다.