blob: 80f0f43c6ee4c268f64ad883675b439015fd218e (
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
31
|
;;; 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
|