Lisp Tape Equilibrium
(defun tape-equilibrium (a)
(let* ((vec (coerce a 'vector))
(n (length vec))
(first-part 0)
(second-part (reduce #'+ vec))
(min most-positive-fixnum))
(loop for i from 0 below (1- n)
do (progn
(incf first-part i)
(decf second-part i)
(let ((difference (abs (- first-part second-part))))
(setf min (if (< difference min) difference min)))))
min))
This keeps left and right running sums and updates the smallest difference at each split point.
Lisp Triangle
(defun triangle (a)
(let* ((sorted (sort (copy-list a) #'<))
(vec (coerce sorted 'vector))
(c (length vec)))
(if (< c 3)
0
(progn
(loop for i from 0 below (- c 2)
do (when (and (> (aref vec i) 0)
(> (aref vec i) (- (aref vec (+ i 2)) (aref vec (1+ i)))))
(return-from triangle 1)))
0))))
This sorts the values and checks nearby triples, because a valid triangle only needs one local match after sorting.