Add elisp/word-count
This commit is contained in:
@@ -0,0 +1,19 @@
|
||||
# Word Count
|
||||
|
||||
Given a phrase, count the occurrences of each word in that phrase.
|
||||
|
||||
For example for the input `"olly olly in come free"`
|
||||
|
||||
```plain
|
||||
olly: 2
|
||||
in: 1
|
||||
come: 1
|
||||
free: 1
|
||||
```
|
||||
|
||||
## Source
|
||||
|
||||
This is a classic toy problem, but we were reminded of it by seeing it in the Go Tour.
|
||||
|
||||
## Submitting Incomplete Solutions
|
||||
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
||||
@@ -0,0 +1,64 @@
|
||||
;;; word-count-test.el --- Tests for word-count (exercism)
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;;; Code:
|
||||
|
||||
(load-file "word-count.el")
|
||||
|
||||
|
||||
(defun equal-assoc (a b)
|
||||
(equal (sort a #'(lambda (a b) (not (string< (car a) (car b)))))
|
||||
(sort b #'(lambda (a b) (not (string< (car a) (car b)))))))
|
||||
|
||||
|
||||
(ert-deftest no-words-test ()
|
||||
(should (equal-assoc (word-count "")
|
||||
nil)))
|
||||
|
||||
|
||||
(ert-deftest count-one-word-test ()
|
||||
(should (equal-assoc (word-count "word")
|
||||
'(("word" . 1)))))
|
||||
|
||||
|
||||
(ert-deftest count-one-of-each-word-test ()
|
||||
(should (equal-assoc (word-count "one of each")
|
||||
'(("each" . 1)
|
||||
("of" . 1)
|
||||
("one" . 1)))))
|
||||
|
||||
|
||||
(ert-deftest multiple-occurrences-of-a-word-test ()
|
||||
(should (equal-assoc (word-count "one fish two fish red fish blue fish")
|
||||
'(("blue" . 1)
|
||||
("red" . 1)
|
||||
("two" . 1)
|
||||
("fish" . 4)
|
||||
("one" . 1)))))
|
||||
|
||||
|
||||
(ert-deftest ignore-punctuation-test ()
|
||||
(should (equal-assoc (word-count "car : carpet as java : javascript!!&@$%^&")
|
||||
'(("javascript" . 1)
|
||||
("java" . 1)
|
||||
("as" . 1)
|
||||
("carpet" . 1)
|
||||
("car" . 1)))))
|
||||
|
||||
|
||||
(ert-deftest include-numbers-test ()
|
||||
(should (equal-assoc (word-count "testing, 1, 2 testing")
|
||||
'(("2" . 1)
|
||||
("1" . 1)
|
||||
("testing" . 2)))))
|
||||
|
||||
|
||||
(ert-deftest normalize-case-test ()
|
||||
(should (equal-assoc (word-count "go Go GO Stop stop")
|
||||
'(("stop" . 2)
|
||||
("go" . 3)))))
|
||||
|
||||
|
||||
(provide 'word-count)
|
||||
;;; word-count-test.el ends here
|
||||
@@ -0,0 +1,21 @@
|
||||
;;; word-count.el --- word-count Exercise (exercism)
|
||||
|
||||
;;; Commentary:
|
||||
|
||||
;;; Code:
|
||||
|
||||
(defun extract-words (s)
|
||||
"Extract lowercased words from S.
|
||||
Splits on whitespace, removes non alphanumeric characters."
|
||||
(split-string (replace-regexp-in-string "[^[:alnum:]_-]" " " (downcase s))))
|
||||
|
||||
(defun word-count (s)
|
||||
"Return an alist word count of words in S."
|
||||
(let ((word-count ()))
|
||||
(dolist (w (extract-words s) word-count)
|
||||
(let ((entry (assoc w word-count)))
|
||||
(if entry (cl-incf (cdr entry))
|
||||
(push (cons w 1) word-count))))))
|
||||
|
||||
(provide 'word-count)
|
||||
;;; word-count.el ends here
|
||||
Reference in New Issue
Block a user