Find Chess960 starting position identifier: Difference between revisions

→‎{{header|Common Lisp}}: Add implementation.
(→‎{{header|Common Lisp}}: Add implementation.)
(→‎{{header|Common Lisp}}: Add implementation.)
Line 243:
 
=={{header|Common Lisp}}==
<lang lisp>(defun sp-id (start-array)
(let* ((n5n-table '("NN---" "N-N--" "N--N-" "N---N" "-NN--" "-N-N-" "-N--N" "--NN-" "--N-N" "---NN"))
(n5n-pattern (substitute-if-not #\- (lambda (ch) (eql ch #\N)) (remove #\Q (remove #\B start-array))))
(knights (position n5n-pattern n5n-table :test #'string-equal))
(queen (position #\Q (remove #\B start-array)))
(left -bishop (position #\B start-array))
(right -bishop (position #\B start-array :from-end t)))
(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>
</lang>
 
{{Out}}
1,479

edits