Name: Anonymous 2009-08-12 10:30
Wow this thread is lame as fuck. Its filled with the same guy posting to keep his thread alive. Fuckin pathetic.
;;; SPLIT-SEQUENCE package is required
(asdf:oos 'asdf:load-op 'split-sequence)
(defun split-by-delims (delims str &rest rest)
(apply #'split-sequence:split-sequence-if #'(lambda (x) (member x delims)) str rest))
(defun string->char-list (str)
(loop for char across str
collect char))
(defun split-by-delim-string (delims str &rest rest)
(apply #'split-by-delims (string->char-list delims) str rest))
(defun sort-chars (str)
(sort (copy-seq str) #'char<))
(defun find-anagrams (s)
(let ((words (split-by-delim-string " :,.!" s :remove-empty-subseqs t))
(sorted-words (make-hash-table :test #'equal)) ; string compare
result-list)
(mapc #'(lambda (x) (pushnew x (gethash (sort-chars (string-upcase x))
sorted-words)
:test #'string-equal)) ; case insensitive
words)
(maphash #'(lambda (key val)
(declare (ignore key))
(unless (< (length val) 2)
(push (nreverse val) result-list)))
sorted-words)
(nreverse result-list)))
(find-anagrams "Hello there, OLLEH! How have you been doing lately?
> my dof... ish dead ;_;
U MENA HASKALL!?
> Yes, sir. I mean Haskell.")
;=>(("Hello" "OLLEH") ("MENA" "mean"))