저장 S 불러오기 L 화살표 키를 뗐다가 누르는 횟수가 적을수록 저장 코드는 시간 비례 짧습니다
압축 기술 : 적응형 산술부호화 [기록 대상] 위치 리스트 = x0, y0, (프레임번호, 키상태) × N, xf, yf 키상태 = "위(1|2),좌우(0|1|2)" 6가지. 연속된 두 기록은 항상 다름. [스트림 구성] 전부 하나의 산술부호기를 통과 1. zigzag(x0 − 0) 좌표 모델 2. zigzag(y0 − 50) 좌표 모델 (스폰 위치 예측, 잔차만 저장) 3. N 개수 모델 4. N회 반복: (Δ프레임 − 1) → 간격 모델, 키 기호 → 키 모델 5. zigzag(xf), zigzag(yf) 좌표 모델 [정수 부호화] v ≥ 0 w = v + 1, e = ⌊log₂w⌋ e를 지수 모델(31심볼)로 부호화 가수 m = w − 2^e 를 e비트로, 상위 min(e,4)비트는 비트트리, 나머지는 원시비트 비트트리 = 지수별 15노드 이진 문맥 트리 (LZMA 방식), 노드마다 적응 이진 모델 부호 있는 값은 zigzag: v≥0 → 2v, v<0 → −2v−1 [키 부호화] 첫 이벤트: 6심볼 절대 부호화 이후: 직전 상태 p를 문맥으로, p를 제외한 5가지 중 순위 r = k − [k > p] 문맥 6개 × 5심볼 [확률 모델] 리스트 1개(2919칸)에 전부 저장, 저장·불러오기 시작 시 전부 1로 초기화 증분 2, 합계 상한 8192 초과 시 전체 반감(최소 1) 배치: 키첫 0(6) / 키문맥 6(6×5) / 좌표지수 36(31) / 간격지수 67(31) / 개수지수 98(31) / 트리 129·1059·1989 (각 31×15×2) [산술부호기] Witten–Neal–Cleary, 24비트 TOP=2²⁴−1, HALF=2²³, QUARTER=2²², 3Q=3·2²² 구간 갱신: high = low + ⌊range·cumHigh/total⌋ − 1, low = low + ⌊range·cumLow/total⌋ 정규화: high<HALF → 0 출력 / low≥HALF → 1 출력, HALF 감산 / QUARTER≤low, high<3Q → 보류비트 +1, QUARTER 감산 → 각 경우 구간 2배 보류비트(underflow) 방식이라 캐리 전파 없음 종료: 보류+1 후 low<QUARTER면 0, 아니면 1 출력 후 마지막 글자까지 0 채움 모든 중간값 < 2⁵³ (range·total ≤ 2³⁶) 이라 배정밀도로 정확 [문자 포장] phase-in 부호 문자표 49,978자, U = 2¹⁶ − 49,978 = 15,558 인코드: 15비트 누적 후 값 < U → 그 값을, 아니면 16번째 비트까지 받아 값 − U 를 출력 디코드: 색인 i ≤ U → 15비트(i−1), i > U → 16비트(i−1+U) 평균 15.560비트/글자 (이 문자표 상한 15.609의 99.7%) 색인 조회는 문자표 문자열에 대한 이진탐색 16회 (⟨~번째 글자⟩ 사용) [문자표 선별] BMP 65,536자에서 제외 서로게이트 / 미할당·제어·사용자영역 / 공백·결합문자 / 한글 자모(인접 결합) /소문자와 겹치는 대문자(⟨항목 번호⟩가 대소문자 무시) / NFC 비안정 /숫자로 파싱되는 문자 / 우→좌 문자 / ASCII·라틴1 / 특수블록·비가시 문자→ 잔여 49,978자 (한글 11,172 + 한자 27,590 + 기타 11,216), 코드포인트 오름차순 [안전장치] 디코드 시 N > 50·len + 100 이면 0으로 강제 입력 소진(위치 > len + 8) 시 이벤트 루프 즉시 중단→ 잘못된 코드를 붙여넣어도 입력 길이에 비례한 시간만 소모