summaryrefslogtreecommitdiff
path: root/exercism/emacs-lisp/anagram/anagram.el
blob: a2c0bc07e2450a572bb3ebba5fa504024b40da72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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