Scheme どう書く?的
整列済みの number のリストがある。
'(1 3 4 5 6 12 13 15)
このようなリストで数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみを書くような記法を導入する。
最初の例のリストであれば以下のようになる。
'(1 (3 . 6) (12 . 13) 15)
このようなリストの変換をするコードを書きたい。
書いてみました。こんな感じ。
う〜ん、なんかベタだなぁ。もっと、おぉ!というのが書きたい。
SRFIとか覚えないとダメかな・・・。
(define (compact-number-list lst) (define (skip-to-end l) (if (null? (cdr l)) l (if (= (+ 1 (car l)) (cadr l)) (skip-to-end (cdr l)) l))) (if (null? lst) '() (let ([beg (car lst)] [r (skip-to-end lst)]) (cond [(null? r) lst] [(= beg (car r)) (cons beg (compact-number-list (cdr r))) ] [else (cons (cons beg (car r)) (compact-number-list (cdr r)))]))))