42 lines
1.4 KiB
Scheme
42 lines
1.4 KiB
Scheme
(import (scheme base)
|
|
(scheme inexact)
|
|
(scheme write))
|
|
|
|
(define *words* (make-vector 38 ""))
|
|
|
|
(define (create-words)
|
|
(vector-set! *words* 1 "1")
|
|
(vector-set! *words* 2 "0")
|
|
(do ((i 3 (+ 1 i)))
|
|
((= i (vector-length *words*)) )
|
|
(vector-set! *words* i (string-append (vector-ref *words* (- i 1))
|
|
(vector-ref *words* (- i 2))))))
|
|
|
|
;; in this context, word only contains 1 or 0
|
|
(define (entropy word)
|
|
(let* ((N (string-length word))
|
|
(num-ones 0)
|
|
(num-zeros 0))
|
|
(string-for-each (lambda (c)
|
|
(if (char=? c #\1)
|
|
(set! num-ones (+ 1 num-ones))
|
|
(set! num-zeros (+ 1 num-zeros))))
|
|
word)
|
|
(if (or (zero? num-ones) (zero? num-zeros))
|
|
0
|
|
(- 0
|
|
(* (/ num-ones N) (log (/ num-ones N) 2))
|
|
(* (/ num-zeros N) (log (/ num-zeros N) 2))))))
|
|
|
|
;; display values
|
|
(create-words)
|
|
(do ((i 1 (+ 1 i)))
|
|
((= i (vector-length *words*)) )
|
|
(display (string-append (number->string i)
|
|
" "
|
|
(number->string
|
|
(string-length (vector-ref *words* i)))
|
|
" "
|
|
(number->string
|
|
(entropy (vector-ref *words* i)))
|
|
"\n")))
|