Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <pre><code>#lang r6rs (library (huffman-table) (export make-table find) (import (rnrs base (6)) (rnrs io simple) (only (racket base) bytes bytes-length bytes-ref make-hash hash-set! hash-ref do) (rnrs mutable-pairs (6))) (define (make-node left right) (list left right)) (define (left node) (car node)) (define (right node) (cadr node)) (define (left! node left) (set-car! node left) left) (define (right! node right) (set-car! (cdr node) right) right) (define (node? object) (eq? (car object) 'node)) (define (make-leaf value) (list 'leaf value)) (define (value leaf) (cadr leaf)) (define (leaf? object) (eq? (car object) 'leaf)) (define (generate-pairs lengths data) (define length (bytes-length lengths)) (let out-loop ((l-idx 0) (d-idx 0) (res '())) (if (= l-idx length) (reverse res) (let in-loop ((t 0) (amt (bytes-ref lengths l-idx)) (temp-res '())) (if (= t amt) (out-loop (+ l-idx 1)(+ d-idx (bytes-ref lengths l-idx))(cons temp-res res)) (in-loop (+ t 1) amt (cons (bytes-ref data (+ d-idx t)) temp-res))))))) (define (add-nodes node-lst) (let loop ((added-nodes '()) (node-lst node-lst)) (cond ((null? node-lst) (reverse added-nodes)) (else (let ((node (car node-lst)) (left-child (make-node '() '())) (right-child (make-node '() '()))) (if (null? (left node)) (begin (left! node left-child) (right! node right-child) (loop (cons right-child (cons left-child added-nodes)) (cdr node-lst))) (begin (right! node right-child) (loop (cons right-child added-nodes) (cdr node-lst))))))))) (define (label-nodes! node-lst values) (let loop ((node-lst node-lst) (values values)) (cond ((null? values) node-lst) ((null? (cdr values))(if (null? (left (car node-lst))) (left! (car node-lst) (car values)) (right! (car node-lst) (car values))) node-lst) (else (if (null? (left (car node-lst))) (begin (left! (car node-lst) (car values)) (right! (car node-lst) (cadr values)) (loop (cdr node-lst)(cddr values))) (begin (right! (car node-lst)(make-leaf (car values))) (loop (cdr node-lst)(cdr values)))))))) (define (make-tree pairs) (define root (make-node '() '())) ;(define curr-nodes (list root)) (let loop ((curr-nodes (list root)) (pairs pairs)) (cond ((null? pairs) root) (else (loop (add-nodes (label-nodes! curr-nodes (car pairs))) (cdr pairs)))))) (define (atom? el) (not (pair? el))) (define (add bit bitstr) (if bitstr (string-append (number-&gt;string bit) bitstr) #f)) (define (code symbol tree) (cond ((null? tree) #f) ((atom? tree) (if (= tree symbol) "" #f)) (else (or (add 0 (code symbol (left tree))) (add 1 (code symbol (right tree))))))) (define (make-table lengths data) (define pairs (generate-pairs lengths data)) (define tree (make-tree pairs)) (define table (make-hash)) (do ((i 0 (+ i 1))) ((= i (bytes-length data)) table) (let ((val (bytes-ref data i))) (hash-set! table (code val tree) val)))) (define (find table bitstring) (hash-ref table bitstring #f)) ) </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload