summaryrefslogtreecommitdiff
path: root/exercism/emacs-lisp/anagram/anagram.el
diff options
context:
space:
mode:
Diffstat (limited to 'exercism/emacs-lisp/anagram/anagram.el')
-rw-r--r--exercism/emacs-lisp/anagram/anagram.el30
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