25 lines
787 B
Plaintext
25 lines
787 B
Plaintext
(define task '(0 1 2 4 6 7 8 11 12 14 15 16 17 18 19 20 21 22 23 24 25 27 28 29 30 31 32 33 35 36 37 38 39))
|
|
|
|
;; 1- GROUPING
|
|
(define (group-range item acc)
|
|
(if
|
|
(or (empty? acc) (!= (caar acc) (1- item)))
|
|
(cons (cons item item) acc)
|
|
(begin (set-car! (car acc) item) acc)))
|
|
|
|
;; intermediate result
|
|
;; (foldl group-range () task)
|
|
;; → ((39 . 35) (33 . 27) (25 . 14) (12 . 11) (8 . 6) (4 . 4) (2 . 0))
|
|
|
|
;; 2- FORMATTING
|
|
(define (range->string range)
|
|
(let ((from (rest range)) (to (first range)))
|
|
(cond
|
|
((= from to) (format "%d " from))
|
|
((= to (1+ from)) (format "%d, %d " from to))
|
|
(else (format "%d-%d " from to)))))
|
|
|
|
;; 3 - FINAL
|
|
(string-join (map range->string (reverse (foldl group-range () task))) ",")
|
|
→ "0-2 ,4 ,6-8 ,11, 12 ,14-25 ,27-33 ,35-39 "
|