32 lines
933 B
Common Lisp
32 lines
933 B
Common Lisp
(defun make-fibwords (array)
|
|
(loop for i from 0 below 37
|
|
for j = "0" then (concatenate 'string j k)
|
|
and k = "1" then j
|
|
do (setf (aref array i) k))
|
|
array)
|
|
|
|
(defvar *fib* (make-fibwords (make-array 37)))
|
|
|
|
(defun entropy (string)
|
|
(let ((table (make-hash-table :test 'eql))
|
|
(entropy 0d0)
|
|
(n (length string)))
|
|
(mapc (lambda (c)
|
|
(setf (gethash c table) (+ (gethash c table 0) 1)))
|
|
(coerce string 'list))
|
|
(maphash (lambda (k v)
|
|
(declare (ignore k))
|
|
(decf entropy (* (/ v n) (log (/ v n) 2))))
|
|
table)
|
|
entropy))
|
|
|
|
(defun string-or-dots (string)
|
|
(if (> (length string) 40)
|
|
"..."
|
|
string))
|
|
|
|
(format t "~2A ~10A ~17A ~A~%" "N" "Length" "Entropy" "Fibword")
|
|
(loop for i below 37
|
|
for n = (aref *fib* i) do
|
|
(format t "~2D ~10D ~17,15F ~A~%"
|
|
(1+ i) (length n) (entropy n) (string-or-dots n)))
|