summaryrefslogtreecommitdiff
path: root/coding-exercises/2/67.rkt
diff options
context:
space:
mode:
authorMike Vink <mike1994vink@gmail.com>2023-03-27 21:58:09 +0200
committerMike Vink <mike1994vink@gmail.com>2023-03-27 21:58:09 +0200
commit5254a0befde355fca2711033f77047cf0bb5c08f (patch)
treeb6d07966babf647cd930bf82077f2d31985a8018 /coding-exercises/2/67.rkt
parentac1bf1b75868c873037f742b727e79ee5a97bae2 (diff)
moar
Diffstat (limited to 'coding-exercises/2/67.rkt')
-rw-r--r--coding-exercises/2/67.rkt105
1 files changed, 105 insertions, 0 deletions
diff --git a/coding-exercises/2/67.rkt b/coding-exercises/2/67.rkt
new file mode 100644
index 0000000..d6021b1
--- /dev/null
+++ b/coding-exercises/2/67.rkt
@@ -0,0 +1,105 @@
+#lang racket
+(require "../../shared/lists.rkt")
+(define (make-leaf symbol weight)
+ (list 'leaf symbol weight))
+
+(define (leaf? object)
+ (eq? (car object) 'leaf))
+
+(define (symbol-leaf x)
+ (cadr x))
+
+(define (weight-leaf x)
+ (caddr x))
+
+(define (make-code-tree left right)
+ (list
+ left
+ right
+ (append (symbol-set left)
+ (symbol-set right))
+ (+ (weight left)
+ (weight right))))
+
+(define (left-branch tree)
+ (car tree))
+
+(define (right-branch tree)
+ (cadr tree))
+
+(define (symbol-set tree)
+ (if (leaf? tree)
+ (list (symbol-leaf tree))
+ (caddr tree)))
+
+(define (weight tree)
+ (if (leaf? tree)
+ (weight-leaf tree)
+ (cadddr tree)))
+
+(define (decode bits tree)
+ (define (decode-1 bits current-branch)
+ (if (null? bits)
+ '()
+ (let ((next-branch
+ (choose-branch (car bits) current-branch)))
+ (if (leaf? next-branch)
+ (cons (symbol-leaf next-branch)
+ (decode-1 (cdr bits) tree))
+ (decode-1 (cdr bits) next-branch)))))
+ (decode-1 bits tree))
+
+(define (choose-branch bit branch)
+ (cond ((= bit 0) (left-branch branch))
+ ((= bit 1) (right-branch branch))
+ (else (error "bad bit -- CHOOSE-BRANCH" bit))))
+
+(define (adjoin-set x mset)
+ (cond ((null? mset) (list x))
+ ((< (weight x) (weight (car mset))
+ (cons x mset)))
+ (else (cons (car mset)
+ (adjoin-set x (cdr mset))))))
+
+(define (make-leaf-set pairs)
+ (if (null? pairs)
+ '()
+ (let ((pair (car pairs)))
+ (adjoin-set (make-leaf (car pair)
+ (cadr pair))
+ (make-leaf-set (cdr pairs))))))
+
+;; 67
+(define sample-tree
+ (make-code-tree (make-leaf 'A 4)
+ (make-code-tree
+ (make-leaf 'B 2)
+ (make-code-tree
+ (make-leaf 'D 1)
+ (make-leaf 'C 1)))))
+(define sample-message '(0 1 1 0 0 1 0 1 0 1 1 1 0))
+(decode sample-message sample-tree)
+;; '(A D A B B C A)
+
+;; 68
+(define (encode message tree)
+ (if (null? message)
+ '()
+ (append (encode-symbol (car message) tree)
+ (encode (cdr message) tree))))
+
+(define (encode-symbol s tree)
+ (define (bits result subtree)
+ (cond ((and (leaf? subtree)
+ (equal? s (car (symbol-set subtree))))
+ result)
+ ((leaf? subtree) '())
+ (else
+ (let ((left (bits
+ (cons 0 result)
+ (left-branch subtree))))
+ (if (null? left)
+ (bits (cons 1 result) (right-branch subtree))
+ left)))))
+ (reverse (bits '() tree)))
+(encode (decode sample-message sample-tree) sample-tree)