Find Chess960 starting position identifier: Difference between revisions

→‎{{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)
Simple version with no error checking.
(and (string-equal (sort (copy-seq start-array) #'string-lessp) "BBKNNQRR")
(not (equal (right-bishopmod (position #\B start-array) :from-end t))2)
(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))))
 
<lang lisp>(defun sp-id (start-array)
(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
(n5n-pattern (substitute-if-not #\- (lambda (ch) (eql ch #\N)) (remove #\Q (remove #\B start-array))))
(let* ((bishopless (remove #\B start-array))
(knights (position n5n-pattern n5n-table :test #'string-equal))
(queen (queenless (positionremove #\Q (remove #\B start-array)bishopless))
(leftn5n-bishoppattern (positionsubstitute-if-not #\B start-array (lambda (ch) (eql ch #\N)) queenless))
(let* ( (n5n-table '("NN---" "N-N--" "N--N-" "N---N" "-NN--" "-N-N-" "-N--N" "--NN-" "--N-N" "---NN"))
(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))
(cond ((zerop (modqueen left-bishop 2)) (list left-bishop right-bishop (position #\Q bishopless))
(t left-bishop (listposition right-bishop#\B leftstart-bishop))array))
(+ (* 96 knights) (* 16 queen)right-bishop (*position 4#\B darkstart-bishop)array light:from-bishop)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