Lisp Peaks
(defun peaks (a)
(let ((n (length a)))
(if (<= n 2)
0
(let* ((vec (coerce a 'vector))
(sum (make-array n :initial-element 0))
(last -1)
(dist 0))
(loop for i from 1 below (1- n)
do (progn
(setf (aref sum i) (aref sum (1- i)))
(when (and (> (aref vec i) (aref vec (1- i)))
(> (aref vec i) (aref vec (1+ i))))
(setf dist (max dist (- i last)))
(setf last i)
(incf (aref sum i)))))
(setf (aref sum (1- n)) (aref sum (- n 2)))
(if (zerop (aref sum (1- n)))
0
(progn
(setf dist (max dist (- n last)))
(loop for i from (1+ (ash dist -1)) below dist
do (when (zerop (mod n i))
(let ((lst 0)
(j i))
(loop while (<= j n)
do (if (<= (aref sum (1- j)) lst)
(return)
(progn
(setf lst (aref sum (1- j)))
(incf j i))))
(when (> j n)
(return-from peaks (floor n i))))))
(setf last dist)
(loop while (/= 0 (mod n last))
do (incf last))
(floor n last)))))))
This finds the peak positions, then tests how many equal blocks can each contain at least one peak.