Lisp Dominator
(defun dominator (a)
(let ((vec (coerce a 'vector))
(size 0) (value 0) (index 0))
(loop for k from 0 below (length vec)
for v = (aref vec k)
do (cond
((zerop size) (incf size) (setf value v) (setf index k))
((/= value v) (decf size))
(t (incf size))))
(let ((candidate (if (> size 0) value -1))
(count 0))
(loop for v across vec do (when (= v candidate) (incf count)))
(when (<= count (/ (length vec) 2))
(setf index -1))
index)))
This finds a value that appears in more than half of the array, then returns one valid index for it.