Created p90 the queens problem.

Pascal J. Bourguignon [2012-10-22 21:49]
Created p90 the queens problem.
Filename
p90.lisp
diff --git a/p90.lisp b/p90.lisp
new file mode 100644
index 0000000..c4cd4af
--- /dev/null
+++ b/p90.lisp
@@ -0,0 +1,562 @@
+#-(and) "
+P90 (**) Eight queens problem
+
+    This is a classical problem in computer science. The objective is
+    to place eight queens on a chessboard so that no two queens are
+    attacking each other; i.e., no two queens are in the same row, the
+    same column, or on the same diagonal.
+
+    Hint: Represent the positions of the queens as a list of numbers
+    1..N. Example: [4,2,7,3,6,8,5,1] means that the queen in the first
+    column is in row 4, the queen in the second column is in row 2,
+    etc. Use the generate-and-test paradigm.
+
+"
+
+(defvar *queen-board-size* 8)
+
+
+
+;; We could use a list instead of a vector with fill pointer to
+;; represent the board.  But instead of incrementing and decrementing
+;; the fill-pointer, we would have to cons or free a cell.
+
+(defun make-board (&optional (initial-size 0))
+  (make-array *queen-board-size* :fill-pointer initial-size :element-type 'fixnum
+              :initial-element -1))
+
+(defun put-queen (board col row)
+  (assert (= col (length board)))
+  (vector-push row board))
+
+(defun remove-queen (board col)
+  (assert (= (1+ col) (length board)))
+  (vector-pop board))
+
+
+
+(defun valid-queen-position-p (board col row)
+  (or (zerop col)
+      (and
+       ;; not on the same row:
+       (notany (lambda (other-row) (= other-row row)) board)
+       ;; not on a same diagonal:
+       (loop
+         :for other-col :below col
+         :for other-row :across board
+         :never (= (- col other-col) (abs (- row other-row)))))))
+
+
+(defun queens ()
+  (let ((results '()))
+    (labels ((collect (board)
+               (push (copy-seq board) results))
+             (search-queens (board col)
+               (if (= col *queen-board-size*)
+                   (collect board)
+                   (loop
+                     :for row :below *queen-board-size*
+                     :when (valid-queen-position-p board col row)
+                     :do (progn
+                           (put-queen board col row)
+                           (search-queens board (1+ col))
+                           (remove-queen board col))))))
+      (search-queens (make-board) 0)
+      results)))
+
+
+;; (queens)
+;;  --> (#(7 3 0 2 5 1 6 4)
+;;       #(7 2 0 5 1 4 6 3)
+;;       #(7 1 4 2 0 6 3 5)
+;;       #(7 1 3 0 6 4 2 5)
+;;       #(6 4 2 0 5 7 1 3)
+;;       #(6 3 1 7 5 0 2 4)
+;;       #(6 3 1 4 7 0 2 5)
+;;       #(6 2 7 1 4 0 5 3)
+;;       #(6 2 0 5 7 4 1 3)
+;;       #(6 1 5 2 0 3 7 4)
+;;       #(6 1 3 0 7 4 2 5)
+;;       #(6 0 2 7 5 3 1 4)
+;;       #(5 7 1 3 0 6 4 2)
+;;       #(5 3 6 0 7 1 4 2)
+;;       #(5 3 6 0 2 4 1 7)
+;;       #(5 3 1 7 4 6 0 2)
+;;       #(5 3 0 4 7 1 6 2)
+;;       #(5 2 6 3 0 7 1 4)
+;;       #(5 2 6 1 7 4 0 3)
+;;       #(5 2 6 1 3 7 0 4)
+;;       #(5 2 4 7 0 3 1 6)
+;;       #(5 2 4 6 0 3 1 7)
+;;       #(5 2 0 7 4 1 3 6)
+;;       #(5 2 0 7 3 1 6 4)
+;;       #(5 2 0 6 4 7 1 3)
+;;       #(5 1 6 0 3 7 4 2)
+;;       #(5 1 6 0 2 4 7 3)
+;;       #(5 0 4 1 7 2 6 3)
+;;       #(4 7 3 0 6 1 5 2)
+;;       #(4 7 3 0 2 5 1 6)
+;;       #(4 6 3 0 2 7 5 1)
+;;       #(4 6 1 5 2 0 7 3)
+;;       #(4 6 1 5 2 0 3 7)
+;;       #(4 6 1 3 7 0 2 5)
+;;       #(4 6 0 3 1 7 5 2)
+;;       #(4 6 0 2 7 5 3 1)
+;;       #(4 2 7 3 6 0 5 1)
+;;       #(4 2 0 6 1 7 5 3)
+;;       #(4 2 0 5 7 1 3 6)
+;;       #(4 1 7 0 3 6 2 5)
+;;       #(4 1 5 0 6 3 7 2)
+;;       #(4 1 3 6 2 7 5 0)
+;;       #(4 1 3 5 7 2 0 6)
+;;       #(4 0 7 5 2 6 1 3)
+;;       #(4 0 7 3 1 6 2 5)
+;;       #(4 0 3 5 7 1 6 2)
+;;       #(3 7 4 2 0 6 1 5)
+;;       #(3 7 0 4 6 1 5 2)
+;;       #(3 7 0 2 5 1 6 4)
+;;       #(3 6 4 2 0 5 7 1)
+;;       #(3 6 4 1 5 0 2 7)
+;;       #(3 6 2 7 1 4 0 5)
+;;       #(3 6 0 7 4 1 5 2)
+;;       #(3 5 7 2 0 6 4 1)
+;;       #(3 5 7 1 6 0 2 4)
+;;       #(3 5 0 4 1 7 2 6)
+;;       #(3 1 7 5 0 2 4 6)
+;;       #(3 1 7 4 6 0 2 5)
+;;       #(3 1 6 4 0 7 5 2)
+;;       #(3 1 6 2 5 7 4 0)
+;;       #(3 1 6 2 5 7 0 4)
+;;       #(3 1 4 7 5 0 2 6)
+;;       #(3 0 4 7 5 2 6 1)
+;;       #(3 0 4 7 1 6 2 5)
+;;       #(2 7 3 6 0 5 1 4)
+;;       #(2 6 1 7 5 3 0 4)
+;;       #(2 6 1 7 4 0 3 5)
+;;       #(2 5 7 1 3 0 6 4)
+;;       #(2 5 7 0 4 6 1 3)
+;;       #(2 5 7 0 3 6 4 1)
+;;       #(2 5 3 1 7 4 6 0)
+;;       #(2 5 3 0 7 4 6 1)
+;;       #(2 5 1 6 4 0 7 3)
+;;       #(2 5 1 6 0 3 7 4)
+;;       #(2 5 1 4 7 0 6 3)
+;;       #(2 4 7 3 0 6 1 5)
+;;       #(2 4 6 0 3 1 7 5)
+;;       #(2 4 1 7 5 3 6 0)
+;;       #(2 4 1 7 0 6 3 5)
+;;       #(2 0 6 4 7 1 3 5)
+;;       #(1 7 5 0 2 4 6 3)
+;;       #(1 6 4 7 0 3 5 2)
+;;       #(1 6 2 5 7 4 0 3)
+;;       #(1 5 7 2 0 3 6 4)
+;;       #(1 5 0 6 3 7 2 4)
+;;       #(1 4 6 3 0 7 5 2)
+;;       #(1 4 6 0 2 7 5 3)
+;;       #(1 3 5 7 2 0 6 4)
+;;       #(0 6 4 7 1 3 5 2)
+;;       #(0 6 3 5 7 1 4 2)
+;;       #(0 5 7 2 6 3 1 4)
+;;       #(0 4 7 5 2 6 1 3))
+
+
+;;;----------------------------------------------------------------------
+;;; Let's eliminate solutions that are symetric to others.
+
+(defun board-variants (board)
+  (loop
+    :with size = (length board)
+    :for transform
+    :in (list
+         ;; rotations:
+         (lambda (new row col) (setf (aref new col)            row))
+         (lambda (new row col) (setf (aref new (- size row 1)) col))
+         (lambda (new row col) (setf (aref new (- size col 1)) (- size row 1)))
+         (lambda (new row col) (setf (aref new row)            (- size col 1)))
+         ;; horizontal mirror:
+         (lambda (new row col) (setf (aref new col)            (- size row 1)))
+         ;; vertical mirror:
+         (lambda (new row col) (setf (aref new (- size col 1)) row))
+         ;; first diagonal:
+         (lambda (new row col) (setf (aref new row)            col))
+         ;; second diagonal:
+         (lambda (new row col) (setf (aref new (- size row 1)) (- size col 1))))
+    :collect (loop
+               :with new = (make-board 8)
+               :for col :below size
+               :for row = (aref board col)
+               :do (funcall transform new row col)
+               :finally (return new))))
+
+
+;;; We'll select the "smallest" equivalent solution:
+
+(defun board-lessp (a b)
+  "Return whether the board A is less than the board B in the 'lexicographic' order."
+  (loop
+    :for ai :across a
+    :for bi :across b
+    :while (= ai bi)
+    :finally (return (< ai bi))))
+
+
+(defun unique-queens ()
+  (remove-duplicates (mapcar (lambda (board)
+                               (reduce (lambda (a b)
+                                         (if (board-lessp a b)
+                                             a
+                                             b))
+                                       (board-variants board)))
+                             (queens))
+                     :test (function equalp)))
+
+;; (mapc  (unique-queens))
+;;  (#(2 5 1 4 7 0 6 3)
+;;   #(2 4 7 3 0 6 1 5)
+;;   #(2 4 1 7 0 6 3 5)
+;;   #(1 6 4 7 0 3 5 2)
+;;   #(1 6 2 5 7 4 0 3)
+;;   #(1 5 7 2 0 3 6 4)
+;;   #(1 5 0 6 3 7 2 4)
+;;   #(1 4 6 3 0 7 5 2)
+;;   #(1 4 6 0 2 7 5 3)
+;;   #(1 3 5 7 2 0 6 4)
+;;   #(0 5 7 2 6 3 1 4)
+;;   #(0 4 7 5 2 6 1 3))
+
+
+
+
+;;; Chess Board Drawing Module
+
+(pushnew :unicode *features*)
+
+#+unicode (progn
+            (defparameter *cell-format*  "~1A")
+            (defparameter *space-white* " ")
+            (defparameter *space-black* " ")
+            (defparameter *chess-symbols*
+              '(((roi      blanc) . "♔")
+                ((reine    blanc) . "♕")
+                ((tour     blanc) . "♖")
+                ((fou      blanc) . "♗")
+                ((cavalier blanc) . "♘")
+                ((pion     blanc) . "♙")
+                ((roi      noir ) . "♚")
+                ((reine    noir ) . "♛")
+                ((tour     noir ) . "♜")
+                ((fou      noir ) . "♝")
+                ((cavalier noir ) . "♞")
+                ((pion     noir ) . "♟"))))
+
+#-unicode (progn
+            (defparameter *cell-format*  "~2A")
+            (defparameter *space-white* "  ")
+            (defparameter *space-black* "::")
+            (defparameter *chess-symbols*
+              '(((roi      blanc) . "RB")
+                ((reine    blanc) . "QB")
+                ((tour     blanc) . "TB")
+                ((fou      blanc) . "FB")
+                ((cavalier blanc) . "CB")
+                ((pion     blanc) . "PB")
+                ((roi      noir ) . "RN")
+                ((reine    noir ) . "QN")
+                ((tour     noir ) . "TN")
+                ((fou      noir ) . "FN")
+                ((cavalier noir ) . "CN")
+                ((pion     noir ) . "PN"))))
+
+(defmethod get-chess-symbol (queen)
+  (cdr (assoc (list 'reine 'noir)
+              *chess-symbols*
+              :test (function equal))))
+
+
+(defmethod dessine ((board vector) &optional (stream t))
+  (flet ((piece (i j)
+           (if (= (aref board i) j)
+               'qn
+               nil))
+         (letters ()
+           (loop
+             :for i :below (length board)
+             :initially (format stream "   ")
+             :do (format stream "  ~? " *cell-format*
+                         (list (format nil "~[A~;B~;C~;D~;E~;F~;G~;H~]" i)))
+             :finally (format stream "~%")))
+         (line ()
+           (loop
+             :with line = (make-string (+ 2  (length (format nil "~?" *cell-format* '(""))))
+                                       :initial-element #\-)
+             :initially (format stream "~A+" line)
+             :repeat (length board)
+             :do (format stream "~A+" line)
+             :finally (format stream "~A~%" line))))
+    (letters)
+    (loop
+      :for j :from (1- (length board)) :downto 0
+      :do (line)
+      :do (loop
+            :for i :below (length board)
+            :initially (format stream " ~A " (1+ j))
+            :do (if (piece i j)
+                    (format stream "| ~A " (get-chess-symbol (piece i j)))
+                    (format stream "| ~A " (if (oddp (+ i j))
+                                               *space-white*
+                                               *space-black*)))
+            :finally (format stream "| ~A~%" (1+ j))))
+    (line)
+    (letters)
+    (values)))
+
+
+
+(defun print-queen-board (board)
+  (dessine board))
+
+
+;; (mapc 'print-queen-board (unique-queens))
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   |   | ♛ |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   |   |   | ♛ |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   | ♛ |   |   |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   |   | ♛ |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   |   |   | ♛ | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 | ♛ |   |   |   |   |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 |   |   | ♛ |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   |   | ♛ |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   | ♛ |   |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   |   | ♛ |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   |   |   |   |   | ♛ | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   | ♛ |   |   |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   | ♛ |   |   |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 | ♛ |   |   |   |   |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 |   |   |   |   |   |   | ♛ |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   | ♛ |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   | ♛ |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   |   | ♛ |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   |   |   |   |   | ♛ | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   | ♛ |   |   |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   |   | ♛ |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 | ♛ |   |   |   |   |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 |   |   | ♛ |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   | ♛ |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   | ♛ |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   | ♛ |   |   |   |   |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   |   |   |   | ♛ |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   | ♛ |   |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   | ♛ |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   |   |   |   |   | ♛ | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   | ♛ |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   |   | ♛ |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   | ♛ |   |   |   |   |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   | ♛ |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   |   |   |   | ♛ |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   |   |   | ♛ | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   | ♛ |   |   |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   |   |   | ♛ |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   | ♛ |   |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   |   |   | ♛ |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   | ♛ |   |   |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   |   |   |   |   |   | ♛ | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   | ♛ |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   | ♛ |   |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   | ♛ |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   |   |   | ♛ |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   | ♛ |   |   |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   | ♛ |   |   |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   |   |   |   |   |   | ♛ | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   | ♛ |   |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   |   |   |   | ♛ |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   | ♛ |   |   |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   |   |   | ♛ |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   | ♛ |   |   |   |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   |   |   |   | ♛ |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   | ♛ |   |   |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   | ♛ |   |   |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   |   |   |   |   | ♛ | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   | ♛ |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   |   |   | ♛ |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   | ♛ |   |   |   |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   |   |   |   | ♛ |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   | ♛ |   |   |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   |   |   | ♛ | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   |   | ♛ |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   | ♛ |   |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   |   | ♛ |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   |   |   | ♛ |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   | ♛ |   |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   |   |   |   |   |   | ♛ | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   | ♛ |   |   |   |   |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   |   | ♛ |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 | ♛ |   |   |   |   |   |   |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 |   |   |   |   |   | ♛ |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   | ♛ |   |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   | ♛ |   |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   | ♛ |   |   |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   |   |   |   |   |   |   | ♛ | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   | ♛ |   |   | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   | ♛ |   |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 |   |   |   |   |   |   | ♛ |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 | ♛ |   |   |   |   |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;      A   B   C   D   E   F   G   H
+;; ---+---+---+---+---+---+---+---+---+---
+;;  8 |   |   | ♛ |   |   |   |   |   | 8
+;; ---+---+---+---+---+---+---+---+---+---
+;;  7 |   |   |   |   |   | ♛ |   |   | 7
+;; ---+---+---+---+---+---+---+---+---+---
+;;  6 |   |   |   | ♛ |   |   |   |   | 6
+;; ---+---+---+---+---+---+---+---+---+---
+;;  5 |   | ♛ |   |   |   |   |   |   | 5
+;; ---+---+---+---+---+---+---+---+---+---
+;;  4 |   |   |   |   |   |   |   | ♛ | 4
+;; ---+---+---+---+---+---+---+---+---+---
+;;  3 |   |   |   |   | ♛ |   |   |   | 3
+;; ---+---+---+---+---+---+---+---+---+---
+;;  2 |   |   |   |   |   |   | ♛ |   | 2
+;; ---+---+---+---+---+---+---+---+---+---
+;;  1 | ♛ |   |   |   |   |   |   |   | 1
+;; ---+---+---+---+---+---+---+---+---+---
+;;      A   B   C   D   E   F   G   H
+;;
+;; -->  (#(2 5 1 4 7 0 6 3)
+;;       #(2 4 7 3 0 6 1 5)
+;;       #(2 4 1 7 0 6 3 5)
+;;       #(1 6 4 7 0 3 5 2)
+;;       #(1 6 2 5 7 4 0 3)
+;;       #(1 5 7 2 0 3 6 4)
+;;       #(1 5 0 6 3 7 2 4)
+;;       #(1 4 6 3 0 7 5 2)
+;;       #(1 4 6 0 2 7 5 3)
+;;       #(1 3 5 7 2 0 6 4)
+;;       #(0 5 7 2 6 3 1 4)
+;;       #(0 4 7 5 2 6 1 3))
+
+;;;; THE END ;;;;
ViewGit