Lisp Almost Magic Square
(defun almost-magic-square (a)
(let ((m (make-array '(3 3)))
(row-sum (make-array 3 :initial-element 0))
(col-sum (make-array 3 :initial-element 0))
(max-sum 0))
(loop for idx from 0 below 9
for val in a
do (setf (aref m (floor idx 3) (mod idx 3)) val))
(dotimes (i 3)
(dotimes (j 3)
(incf (aref row-sum i) (aref m i j))
(incf (aref col-sum i) (aref m j i))))
(dotimes (k 3)
(setf max-sum (max max-sum (aref row-sum k) (aref col-sum k))))
(let ((i 0) (j 0))
(loop while (and (< i 3) (< j 3))
do (let ((diff (min (- max-sum (aref row-sum i))
(- max-sum (aref col-sum j)))))
(incf (aref m i j) diff)
(incf (aref row-sum i) diff)
(incf (aref col-sum j) diff)
(when (= (aref row-sum i) max-sum) (incf i))
(when (and (< j 3) (= (aref col-sum j) max-sum)) (incf j)))))
(loop for idx from 0 below 9
collect (aref m (floor idx 3) (mod idx 3)))))
This adjusts the matrix toward a matching target sum so the rows and columns line up more like a magic square.