27 lines
1.1 KiB
Text
27 lines
1.1 KiB
Text
(define (decompress str)
|
|
(let loop ((dc (fold (lambda (f x) ; dictionary (simplest, not optimized), with reversed codes
|
|
(cons x (cons (list x) f)))
|
|
'() (iota 256)))
|
|
(w '()) ; output sequence (reversed)
|
|
(s 256) ; maximal dictionary code value + 1
|
|
(x '()) ; current symbols sequence
|
|
(r (str-iter str))); input stream
|
|
(cond
|
|
((null? r)
|
|
(reverse w))
|
|
((pair? r)
|
|
(let*((y (cadr (member (car r) dc)))
|
|
(xy (append y x)))
|
|
(if (member xy dc)
|
|
(loop dc (append y w) s xy (cdr r)) ; вряд ли такое будет...
|
|
(loop (cons s (cons xy dc)) ; update dictionary with xy . s
|
|
(append y w) ; add phrase to output stream
|
|
(+ s 1)
|
|
y ; new initial code
|
|
(cdr r))))) ; next input
|
|
(else
|
|
(loop dc w s x (r))))))
|
|
|
|
(print (runes->string
|
|
(decompress (runes->string '(84 79 66 69 79 82 78 79 84 256 258 260 265 259 261 263)))))
|
|
; => TOBEORNOTTOBEORTOBEEORNOT
|