Comment Comment by eadmund > splitting a line into words is a whole project on its ownIs it[1]? My version below accumulates alphabetical characters until it encounters a non-alphabetical one, then increments the count for the accumulated word and resets the accumulator. (let (c accumulator (counts (make-hash-table :test #'equal))) (handler-case (loop (setq c (read-char)) (if (find c "ABCDEFGHIJKLMNOPQRSTUVWXYZ" :test #'char-equal) (push (char-downcase c) accumulator) (when accumulator (incf (gethash (coerce (reverse accumulator) 'string) counts 0)) (setq accumulator nil)))) (end-of-file () (when accumulator (incf (gethash (coerce (reverse accumulator) 'string) counts 0)) (setq accumulator nil)) (maphash #'(lambda (word count) (push (list count word) accumulator)) counts) (format t "~{~&~{~a ~a~}~%~}" (reverse (last (sort accumulator #'< :key #'car) (let ((n (second sb-ext:*posix-argv*))) (if n (parse-integer n) 100)))))))) It’s not exactly pretty or idiomatic, but its 19 lines appear to get the job done.1: Well, technically it is, because there is SPLIT-SEQUENCE: https://github.com/sharplispers/split-sequence parent eadmund 1 year ago
Is it[1]? My version below accumulates alphabetical characters until it encounters a non-alphabetical one, then increments the count for the accumulated word and resets the accumulator.
It’s not exactly pretty or idiomatic, but its 19 lines appear to get the job done.1: Well, technically it is, because there is SPLIT-SEQUENCE: https://github.com/sharplispers/split-sequence