Find Chess960 starting position identifier: Difference between revisions
Find Chess960 starting position identifier (view source)
Revision as of 01:37, 24 July 2022
, 1 year ago→{{header|Common Lisp}}: Add validity check.
(→{{header|Common Lisp}}: Add validity check.) |
|||
Line 243:
=={{header|Common Lisp}}==
<lang lisp>(defun valid-array-p (start-array)
(and (string-equal (sort (copy-seq start-array) #'string-lessp) "BBKNNQRR")
(mod (position #\B start-array :from-end t) 2)))
(< (position #\R start-array) (position #\K start-array))
(< (position #\K start-array) (position #\R start-array :from-end t))))
(if (not (valid-array-p start-array))
(let* ((n5n-table '("NN---" "N-N--" "N--N-" "N---N" "-NN--" "-N-N-" "-N--N" "--NN-" "--N-N" "---NN"))▼
-1
(let* ((bishopless (remove #\B start-array))
(knights (position n5n-pattern n5n-table :test #'string-equal))▼
(
▲
▲ (right-bishop (position #\B start-array :from-end t)))
▲ (knights (position n5n-pattern n5n-table :test #'string-equal))
(destructuring-bind (dark-bishop light-bishop) (mapcar (lambda (p) (floor p 2))▼
▲ (destructuring-bind (dark-bishop light-bishop) (mapcar (lambda (p) (floor p 2))
(cond ((zerop (mod left-bishop 2)) (list left-bishop right-bishop))
(t (list right-bishop left-bishop))))
(+ (* 96 knights) (* 16 queen) (* 4 dark-bishop) light-bishop)))))
(loop for ary in '("RNBQKBNR""QNRBBNKR""RQNBBKRN""RNQBBKRN") doing
(format t "~a: ~a~%" ary (sp-id ary)))</lang>
{{Out}}
|