RosettaCodeData/Task/Entropy/AutoLISP/entropy.lsp
2026-04-30 12:34:36 -04:00

40 lines
753 B
Common Lisp

(defun entropy (str / log2 eCalc strList len ent cnt n new end cPrev)
(defun log2 (x)
(if (> x 0)
(/ (log x) (log 2.0))
)
)
(defun eCalc (cnt len / p)
(setq p (/ (float cnt) len))
(* p (log2 p))
)
(setq
strList (acad_strlsort (mapcar 'chr (vl-string->list str)))
len (length strList)
ent 0.0
cnt 0
n 0
)
(foreach c strList
(setq
n (1+ n)
new (and cPrev (not (eq c cPrev)))
end (= n len)
)
(if (or new end)
(setq
cnt (if (and end (not new)) (1+ cnt) cnt)
ent (+ ent (eCalc cnt len))
cnt 0
)
)
(if (and new end)
(setq ent (+ ent (eCalc 1 len)))
)
(setq
cnt (1+ cnt)
cPrev c
)
)
(* -1 ent)
)