Author: Tord Romstad
Date: 03:00:23 06/08/04
Go up one level in this thread
On June 07, 2004 at 20:19:12, Dann Corbit wrote:
>ftp://cap.connx.com/pub/chess-engines/new-approach/frcpos.c
I just hacked up this one, which I think is neater. I would be happy
if somebody could help me make the PERMUTATIONS function a bit prettier,
though:
(defun random-frc-fen ()
(random-element (frc-fen-strings)))
(defun frc-fen-strings ()
(mapcar #'create-fen-string (frc-back-ranks)))
(defun frc-back-ranks ()
(remove-if-not #'legal-frc-back-rank?
(permutations '(r n b q k b n r))))
(defun legal-frc-back-rank? (list)
(and (king-between-rooks? list)
(opposite-coloured-bishops? list)))
(defun king-between-rooks? (list)
(< (position 'r list) (position 'k list) (position 'r list :from-end t)))
(defun opposite-coloured-bishops? (list)
(oddp (+ (position 'b list) (position 'b list :from-end t))))
(defun permutations (list)
(if (<= (length list) 1)
(list list)
(apply #'append
(mapcar (lambda (x)
(mapcar (lambda (y) (cons x y))
(permutations (remove x list :count 1))))
(remove-duplicates list)))))
(defun create-fen-string (back-rank)
(let ((back-rank-string
(apply #'concatenate 'string (mapcar #'symbol-name back-rank))))
(format nil "~a/pppppppp/8/8/8/8/PPPPPPPP/~a w KQkq - 0 1"
(string-downcase back-rank-string)
(string-upcase back-rank-string))))
(defun random-element (list)
(let ((length (length list)))
(nth (random length) list)))
Tord
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.