;;; anagram.el --- Anagram (exercism) ;;; Commentary: ;;; Code: (require 'cl-lib) (require 'seq) (defun anagram-key (text) (let ((text-list (split-string (downcase text) ""))) (apply 'concat (sort text-list 'string<)))) (defun anagram-make-table (words) (let* ((table (make-hash-table :test 'equal)) (add-word (lambda (w) (let* ((key (anagram-key w)) (entry (nconc (gethash key table '()) (list w)))) (puthash (anagram-key w) entry table))))) (progn (mapc add-word words) table))) (defun anagrams-for (word candidates) (let ((table (anagram-make-table candidates)) (key (anagram-key word)) (filter-results (lambda (words) (seq-filter (lambda (w) (not (equal word w))) words)))) (funcall filter-results (gethash key table '())))) (provide 'anagram) ;;; anagram.el ends here