Scheme どう書く?的「どうしたデルタ1? 応答しろ!」
整列済みの number のリストがある。
'(1 3 4 5 6 12 13 15)
このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。
最初の例のリストであれば以下のようになる。
'(1 (3 . 6) (12 . 13) 15)
このようなリストの変換をするコードを書きたい。
Scheme どう書く?的 - ひげぽん OSとか作っちゃうかMona-
group-sequenceを使ってみた。
関数名のdelta1?がかっこいい。
(use srfi-1) (use gauche.sequence) (define (group-number-list l) (define (delta1? knil) (let ((prev knil)) (lambda (a _) (begin0 (= (+ prev 1) a) (set! prev a))))) (map (lambda (x) (if (and (pair? x) (null? (cdr x))) (car x) (cons (car x) (last x)))) (group-sequence l :test (delta1? (car l)))))
(追記)空リストのときエラーになる><。