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>(setq max-lisp-eval-depth 10000)
<lang Lisp>(defun split-into-ranges (numbers)
(let* ((last-number (pop numbers))
(range (list last-number))
ranges)
(dolist (n numbers)
(if (= n (1+ last-number))
(push n range)
(push (nreverse range) ranges)
(setq range (list n)))
(setq last-number n))
(nreverse (cons (nreverse range) ranges))))


(defun ab (a ls)
(defun format-range (range)
(cond
(if ls (if (= (+ a 1) (car ls))
(abc a (car ls) (cdr ls))
((not range)
(error "invalid range"))
(format "%d,%s" a (ab (car ls) (cdr ls))))
(format "%d" a)))
((= (length range) 1)
(number-to-string (car range)))
((= (length range) 2)
(format "%d,%d" (car range) (cadr range)))
(t
(format "%d-%d" (car range) (car (last range))))))


(defun abc (a b ls)
(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,%s" a c (ab (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