; 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)