; peaks
(define (subvector vec start end)
(let ((subvec (make-vector (- end start))))
(do ((i start (+ i 1)) (j 0 (+ j 1)))
((= i end) subvec)
(vector-set! subvec j (vector-ref vec i)))))
(define (peaks vec)
(let ((len (vector-length vec)))
(let loop ((first 0) (last 1) (subvecs (list)))
(cond ((= last len) (reverse subvecs))
((and (< (vector-ref vec first)
(vector-ref vec last))
(= (vector-ref vec last)
(vector-ref vec (+ last 1))))
(loop first (+ last 1) subvecs))
((and (< (vector-ref vec first)
(vector-ref vec last))
(> (vector-ref vec last)
(vector-ref vec (+ last 1))))
(loop (+ last 1) (+ last 2)
(cons (subvector vec first (+ last 2)) subvecs)))
(else (loop last (+ last 1) subvecs))))))
(display (peaks (vector 5 5 4 5 4))) (newline)
(display (peaks (vector 6 5 4 4 4 4 4 5 6 7 7 7 7 7 6))) (newline)
(display (peaks (vector 5 5 5 5 4 5 4 5 6 7 8 8 8 8 8 9 9 8))) (newline)