Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Fen generator

Author: Uri Blass

Date: 01:29:11 02/24/05

Go up one level in this thread


On February 24, 2005 at 03:34:58, Steffen Jakob wrote:

>Hi!
>
>Uri mentioned that a general Fen generator would be useful for him:
>
>> This idea seems to be good also for generalization to write a function that gets
>> all the fen of 3 and 4 and 5 pieces(I think to use it for debugging the nalimov
>> tablebases and also debugging my function to detect correct fen)
>
>> Uri
>
>The following should do the work. This code is also able to handle multiple
>pieces of the same type (e.g. "KPPk"). Oh, and for those who judge the quality
>of code by counting generated assembler lines: this code probably sucks bigtime!
>
>Greetings,
>Steffen.
>
>
>#include <iostream>
>#include <string>
>#include <algorithm>
>
>void GenerateFens(const std::string& pieces) {
>	char board[64] = {
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0,
>		0, 0, 0, 0, 0, 0, 0, 0
>	};
>
>	// Initial setting of pieces in the empty board.
>	std::copy(pieces.begin(), pieces.end(), &board[0]);
>	// Prepare for permutating.
>	std::sort(&board[0], &board[64]);
>	do {
>		int first_sq = 0;
>		for(int sq = 0; sq < 64; ++sq) {
>			if(board[sq] != 0) { // The square is not empty
>				if(sq - first_sq > 0) {
>					// Flush number of empty squares.
>					std::cout << sq - first_sq;
>				}
>				std::cout << board[sq];
>				first_sq = sq + 1;
>			}
>			if(sq % 8 == 7) { // End of a rank
>				if(sq - first_sq >= 0) {
>					// Flush number of empty squares.
>					std::cout << 1 + sq - first_sq;
>				}
>				if(sq != 63) {
>					std::cout << "/";
>				}
>				first_sq = sq + 1;
>			}
>		}
>		std::cout << " w - - 0 1" << std::endl;
>	}
>	while(std::next_permutation(&board[0], &board[64]));
>}
>
>int main(int argc, char** argv) {
>	GenerateFens("Nn");
>	// GenerateFens("KPk");
>	// GenerateFens("PP");
>	// GenerateFens("PPPPPPPPRNBQKBNRpppppppprnbqkbnr");
>
>	return 0;
>}

Thanks

I had no chance to get to this code by myself for the simple reason of missing
knowledge about library functions.

If I understand correctly

std::copy(pieces.begin(), pieces.end(), &board[0]);

Is it the same as
board[0]='N'
board[1]='n'

std::sort(&board[0], &board[64]);
sort board in lexisographic order so you have the first permutation
board[0]=0;
...
board[61]=0;
board[62]='n'
board[63]='N'

std::next_permutation(
calculate the next permutation in lexixographic order

Uri



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.