Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: FRC start position generator

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.