Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Chess programming puzzle

Author: Steffan Westcott

Date: 13:58:05 02/23/05

Go up one level in this thread


On February 23, 2005 at 03:01:50, Uri Blass wrote:

>I plan to implement something more complex(generating all fen with 4 pieces)
>
>I want to have a loop on all the possible combination of 4 pieces and for every
>combination to have function that generate all the possible fen.

Uri,

The program below will do this for you, I hope you find it useful.

I generalised my earlier Perl program in two respects to increase flexibility :

(Example 1) It will generate all positions using a given collection of pieces.
Duplicates in the collection are catered for eg. KPPk

(Example 2) It will generate all positions using a mandatory collection, plus
all possible selections from another collection, up to a given number of pieces
e.g. Kk (mandatory) plus any 2 selections from QRNBPqrnbp. Again, duplicates are
catered for e.g. In this example, KPPk will be included as one possible
selection.

Example 2 in the code below will generate all 4 piece FENs, as you wanted. The
output is *very* large!


Note that this program also filters out two classes of illegal position :

(1) Pawns on 1st or 8th rank
(2) Adjacent kings


Cheers,
Steffan

##################

sub perm {
    my ($p, $a) = @_;
    if (length $p) {
        $a .= (my $x = chop $p);
        do perm($p,$a) until (($a=(chop $a).$a) =~ /$x$/);
    } else {
        $_ = $a ;
        s/.{8}(?=.)/$&\//g ;                       #insert '/' between ranks
        return if /^.{0,7}[Pp]/ || /[Pp].{0,7}$/ ; #no pawns on 1st or 8th rank
        return if /[Kk][Kk]/ || /[Kk].{7,9}[Kk]/ ; #no adjacent kings
        s/ +(?{$e=length $&})/$e/g ;               #coalesce spaces to digits
        print "$_ w - - 0 1\n";
    }
}

sub place { perm($e = shift, " " x (64-length $e)); }

sub sel {
    my ($q, $r, $i) = @_;          # copy and add $i more pieces from $r to $q
    if ($i) {
        my $t = chop $r;
        sel($q.$t, $r.$t, $i-1);
        sel($q, $r, $i) if length $r;
    } else {
        place($q);                 # print all FENs for this choice of pieces
    };
}

##################

#Example 1 : All KPPk positions
place("KPPk");

#Example 2 : All positions with both kings, and 2 other pieces
#            i.e. Kkxx, KXkx and KXXk
sel("Kk", "QRNBPqrnbp", 2);

#NB: The only illegal positions filtered are those with pawns on 1st
#    or 8th rank, or both kings adjacent to each other



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.