fork download
  1. ; peaks
  2.  
  3. (define (subvector vec start end)
  4. (let ((subvec (make-vector (- end start))))
  5. (do ((i start (+ i 1)) (j 0 (+ j 1)))
  6. ((= i end) subvec)
  7. (vector-set! subvec j (vector-ref vec i)))))
  8.  
  9. (define (peaks vec)
  10. (let ((len (vector-length vec)))
  11. (let loop ((first 0) (last 1) (subvecs (list)))
  12. (cond ((= last len) (reverse subvecs))
  13. ((and (< (vector-ref vec first)
  14. (vector-ref vec last))
  15. (= (vector-ref vec last)
  16. (vector-ref vec (+ last 1))))
  17. (loop first (+ last 1) subvecs))
  18. ((and (< (vector-ref vec first)
  19. (vector-ref vec last))
  20. (> (vector-ref vec last)
  21. (vector-ref vec (+ last 1))))
  22. (loop (+ last 1) (+ last 2)
  23. (cons (subvector vec first (+ last 2)) subvecs)))
  24. (else (loop last (+ last 1) subvecs))))))
  25.  
  26. (display (peaks (vector 5 5 4 5 4))) (newline)
  27. (display (peaks (vector 6 5 4 4 4 4 4 5 6 7 7 7 7 7 6))) (newline)
  28. (display (peaks (vector 5 5 5 5 4 5 4 5 6 7 8 8 8 8 8 9 9 8))) (newline)
Success #stdin #stdout 0.01s 50288KB
stdin
Standard input is empty
stdout
(#(4 5 4))
(#(6 7 7 7 7 7 6))
(#(4 5 4) #(8 9 9 8))