fork download
  1. ; your code goes here
  2. (in-package #:cl-user)
  3. (defpackage #:phrase
  4. (:use #:cl)
  5. (:export #:word-count))
  6. (in-package #:phrase)
  7.  
  8. (defun word-count (phrase)
  9. (let (words word-start word-end)
  10. (labels ((update-word ()
  11. (let* ((word (string-downcase (subseq phrase word-start word-end)))
  12. (count (assoc word words :test #'string-equal)))
  13. (if (null count)
  14. (push (cons word 1) words)
  15. (incf (cdr count))))
  16. (reset-word))
  17. (reset-word ()
  18. (setf word-start nil
  19. word-end nil))
  20. (has-word ()
  21. (not (equal word-end word-start))))
  22. (loop for c across phrase
  23. for i = 0 then (1+ i)
  24. if (alphanumericp c) do
  25. (if (null word-start)
  26. (setf word-start i
  27. word-end (1+ i))
  28. (incf word-end))
  29. else if (has-word) do
  30. (update-word)
  31. finally
  32. (when (has-word)
  33. (update-word))
  34. (return words)))))
  35.  
  36. (print (word-count "Fuck this stupid shit. Fuck!"))
Success #stdin #stdout 0s 10544KB
stdin
Standard input is empty
stdout
(("shit" . 1) ("stupid" . 1) ("this" . 1) ("fuck" . 2))