Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Chess programming puzzle

Author: Anthony Cozzie

Date: 14:04:06 02/22/05

Go up one level in this thread


On February 22, 2005 at 15:49:26, Steffen Jakob wrote:

>On February 22, 2005 at 15:43:44, Scott Gasch wrote:
>
>>On February 22, 2005 at 09:20:31, Steffen Jakob wrote:
>>
>>>On February 22, 2005 at 08:35:07, Andrew Wagner wrote:
>>>
>>>>Hi all.
>>>>I got sidetracked this morning by an interesting chess programming problem. It
>>>>took me a couple hours, but I think I have a working algorithm -- haven't tested
>>>>yet though. Anyway, I got to wondering if others would approach it the same way.
>>>>So I thought I'd make a little competition of it. Post your code here, and I'll
>>>>pick the program I like best and shower praise and adulation on its author. If
>>>>people like this challenge, maybe I'll do one each month or something. Anyway,
>>>>here's the one I did this morning:
>>>>There are 64 x 63 = 4032 ways to put a black knight and white knoght both on a
>>>>chess board. Write a program -- from scratch -- to generate FENs for each of
>>>>these positions. The FENs should look something like: Nn6/8/8/8/8/8/8/8 w - - 0
>>>>1.
>>>>
>>>>I think my code will wind up weighing in at around 60-70 lines of C. Can you do
>>>>better?
>>>
>>>Here is a quick hack. Without comments, with place to optimize, also almost
>>>untested, but shorter than yours ;-)
>>>
>>>
>>>#include <iostream>
>>>
>>>int GetFile(int square) { return square & 7; }
>>>int GetRank(int square) { return square >> 3; }
>>>
>>>int main(int argc, char** argv) {
>>>	for(int white_knight = 0; white_knight < 64; ++white_knight) {
>>>		for(int black_knight = 0; black_knight < 64; ++black_knight) {
>>>			if(white_knight == black_knight) {
>>>				continue;
>>>			}
>>>
>>>			for(int rank = 7; rank >= 0; --rank) {
>>>				int n_empty = 0;
>>>				for(int file = 0; file <= 7; ++file) {
>>>					if(rank == GetRank(white_knight) && file == GetFile(white_knight)) {
>>>						if(n_empty > 0) {
>>>							std::cout << n_empty;
>>>						}
>>>						std::cout << "N";
>>>						n_empty = 0;
>>>					}
>>>					else if(rank == GetRank(black_knight) && file == GetFile(black_knight)) {
>>>						if(n_empty > 0) {
>>>							std::cout << n_empty;
>>>						}
>>>						std::cout << "n";
>>>						n_empty = 0;
>>>					}
>>>					else {
>>>						++n_empty;
>>>					}
>>>				}
>>>				if(n_empty > 0) {
>>>					std::cout << n_empty;
>>>				}
>>>				if(rank != 0) {
>>>					std::cout << "/";
>>>				}
>>>			}
>>>			std::cout << " w - - 0 1" << std::endl;
>>>		}
>>>	}
>>>
>>>	return 0;
>>>}
>>
>>[ scott@wannabe:~/tmp ] % g++34 -O -S steffen.cpp ; wc -l steffen.s
>>     557 steffen.s
>
>Most of this code is because of using streams. If I replace them by printf,
>define the GetXXX() functions inline and compile the code with gcc instead of
>g++ I get 148 assembler lines.
>
>Best wishes,
>Steffen.

The lesson being that C++ streams blow, but we knew that anyway :)

anthony



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.