Range extraction: Difference between revisions
Content added Content deleted
(Emacs Lisp: Improve formatting) |
(Emacs Lisp: Rewrite unreadable alternative solution) |
||
Line 1,728: | Line 1,728: | ||
Vanilla: |
Vanilla: |
||
<lang Lisp>( |
<lang Lisp>(defun split-into-ranges (numbers) |
||
(let* ((last-number (pop numbers)) |
|||
(range (list last-number)) |
|||
ranges) |
|||
(dolist (n numbers) |
|||
⚫ | |||
(push n range) |
|||
(push (nreverse range) ranges) |
|||
(setq range (list n))) |
|||
(setq last-number n)) |
|||
(nreverse (cons (nreverse range) ranges)))) |
|||
(defun |
(defun format-range (range) |
||
(cond |
|||
⚫ | |||
((not range) |
|||
(error "invalid range")) |
|||
⚫ | |||
( |
((= (length range) 1) |
||
(number-to-string (car range))) |
|||
((= (length range) 2) |
|||
⚫ | |||
(t |
|||
⚫ | |||
(defun |
(defun rangext (numbers) |
||
(mapconcat #'format-range (split-into-ranges numbers) ",")) |
|||
(if ls (if (= (+ b 1) (car ls)) |
|||
(abcd a (car ls) (cdr ls)) |
|||
(format "%d,%d,%s" a b (ab (car ls) (cdr ls)))) |
|||
(format "%d,%d" a b))) |
|||
(defun abcd (a c ls) |
|||
(if ls (if (= (+ c 1) (car ls)) |
|||
(abcd a (car ls) (cdr ls)) |
|||
⚫ | |||
(format "%d-%d" a c))) |
|||
(defun rangext (ls) |
|||
(if ls (ab (car ls) (cdr ls)) "")) |
|||
(rangext '(0 1 2 4 6 7 8 11 12 14 |
(rangext '(0 1 2 4 6 7 8 11 12 14 |