; (C) 2006, 2018 Markus Triska triska@metalevel.at ; Public domain code. ; A B C ; D E F G ; H I J K L ; M N O P ; Q R S (defun loop-expand (cells line rest seen code) (if (null cells) `(if (= (+ ,@line) 38) ,(if (null rest) code (loop-expand (car rest) (car rest) (cdr rest) seen code))) (let ((var (car cells))) (if (member var seen) (loop-expand (cdr cells) line rest seen code) (let ((others (remove var line)) (inner `(when (not (aref used ,var)) (setf (aref used ,var) t) ,(loop-expand (cdr cells) line rest (cons var seen) code) (setf (aref used ,var) nil)))) (if (every (lambda (v) (member v seen)) others) `(let ((,var (- 38 ,@others))) (if (and (<= 1 ,var) (<= ,var 19)) ,inner)) `(loop for ,var from 1 to 19 do ,inner))))))) (defmacro expand (lists code) (let ((line (car lists))) (loop-expand line line (cdr lists) nil code))) (defun solve () (let ((used (make-array 20))) (expand ((a b c) (h d a) (c g l) (l p s) (q r s) (h m q) (a e j o s) (b i e m) (c f j n q) (g k o r) (d e f g) (h i j k l) (m n o p) (d i n r) (b f k p)) (print (list a b c d e f g h i j k l m n o p q r s))))) (solve) (quit)