19 lines
645 B
Common Lisp
19 lines
645 B
Common Lisp
(defun read-words (file)
|
|
(with-open-file (stream file)
|
|
(loop with w = "" while w collect (setf w (read-line stream nil)))))
|
|
|
|
(defun anagram (file)
|
|
(let ((wordlist (read-words file))
|
|
(h (make-hash-table :test #'equal))
|
|
longest)
|
|
(loop for w in wordlist with ws do
|
|
(setf ws (sort (copy-seq w) #'char<))
|
|
(setf (gethash ws h) (cons w (gethash ws h))))
|
|
(loop for w being the hash-keys in h using (hash-value wl)
|
|
with max-len = 0 do
|
|
(let ((l (length wl)))
|
|
(if (> l max-len) (setf longest nil max-len l))
|
|
(if (= l max-len) (push wl longest))))
|
|
longest))
|
|
|
|
(format t "~{~{~a ~}~^~%~}" (anagram "unixdict.txt"))
|