diff options
Diffstat (limited to 'exercism/emacs-lisp/anagram/anagram.el')
-rw-r--r-- | exercism/emacs-lisp/anagram/anagram.el | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/exercism/emacs-lisp/anagram/anagram.el b/exercism/emacs-lisp/anagram/anagram.el new file mode 100644 index 0000000..a2c0bc0 --- /dev/null +++ b/exercism/emacs-lisp/anagram/anagram.el @@ -0,0 +1,30 @@ +;;; anagram.el --- Anagram (exercism) + +;;; Commentary: + +;;; Code: + +(require 'cl-lib) + +(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 |