75 lines
2.9 KiB
EmacsLisp
75 lines
2.9 KiB
EmacsLisp
(defun order-alphabetically (str)
|
|
"Put letters in STR in alphabetical order."
|
|
;; split STR into list of individual letters in alphabetical order
|
|
;; and then join the letters back into one string
|
|
(apply #'concat (sort (split-string str "" t) #'string<)))
|
|
|
|
(defun ordered-alphabetically-p (str)
|
|
"Test if letters STR are in alphabetical order."
|
|
(string= (order-alphabetically str) str))
|
|
|
|
|
|
(defun make-list-of-ordered-words (word-list)
|
|
"Create subset of ordered words from words in WORD-LIST."
|
|
(let ((ordered-words))
|
|
(dolist (one-word word-list)
|
|
(when (ordered-alphabetically-p one-word)
|
|
(push (format "%s" one-word) ordered-words)))
|
|
ordered-words))
|
|
|
|
(defun list-length-words (word-list)
|
|
"From the words in WORD-LIST, create list of pairs of words and their length."
|
|
(let ((paired-list)
|
|
(temp-pair))
|
|
(dolist (one-word word-list)
|
|
(setq temp-pair (list (length one-word) one-word))
|
|
(push temp-pair paired-list))
|
|
paired-list))
|
|
|
|
(defun create-list-of-numbers (numbers-and-words-list)
|
|
"Create list of numbers from NUMBERS-AND-WORDS-LIST."
|
|
(let ((list-of-numbers))
|
|
(dolist (one-pair numbers-and-words-list)
|
|
(push (car one-pair) list-of-numbers))
|
|
list-of-numbers))
|
|
|
|
(defun get-largest-number (numbers-and-words-list)
|
|
"Find largest number in NUMBERS-AND-WORDS-LIST."
|
|
(let ((list-of-numbers))
|
|
(setq list-of-numbers (create-list-of-numbers numbers-and-words-list))
|
|
(apply #'max list-of-numbers)))
|
|
|
|
(defun make-list-matching-words (largest-number numbers-and-words-list)
|
|
"List words whose length equals LARGEST-NUMBER."
|
|
(dolist (number-and-word-pair numbers-and-words-list)
|
|
;; test if number in NUMBER-AND-WORD-PAIR matches
|
|
;; LARGEST-NUMBER
|
|
(when (= (nth 0 number-and-word-pair) largest-number)
|
|
;; insert the original word
|
|
(insert (format "%s " (nth 1 number-and-word-pair)))))
|
|
(insert "\n"))
|
|
|
|
(defun get-longest-ordered-words ()
|
|
"Find the longest ordered words in file wordlist.txt.
|
|
A word is an ordered word if its letters are in alphabetical order."
|
|
(let ((all-word-list)
|
|
(just-ordered-words)
|
|
(lengths-and-words)
|
|
(longest-word-length))
|
|
;; Path below needs to be adapted to individual case
|
|
(find-file "~/Documents/Elisp/wordlist.txt")
|
|
(beginning-of-buffer)
|
|
;; Create list of all words in file
|
|
(setq all-word-list (split-string (buffer-string) "\n"))
|
|
;; Test if a word is an ordered word, if so add to JUST-ORDERED-WORDS
|
|
(dolist (one-word all-word-list)
|
|
(if (ordered-alphabetically-p one-word)
|
|
(push one-word just-ordered-words)))
|
|
;; pair word lengths with ordered words
|
|
(setq lengths-and-words (list-length-words just-ordered-words))
|
|
;; Get the longest word length
|
|
(setq longest-word (get-largest-number lengths-and-words))
|
|
(find-file "longest-ordered-words")
|
|
(erase-buffer)
|
|
;; list the longest ordered words
|
|
(make-list-matching-words longest-word lengths-and-words)))
|