Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Chess programming puzzle

Author: Uri Blass

Date: 11:09:07 02/22/05

Go up one level in this thread


On February 22, 2005 at 14:06:28, Uri Blass wrote:

>On February 22, 2005 at 13:56:20, Anthony Cozzie wrote:
>
>>On February 22, 2005 at 13:25:09, Uri Blass wrote:
>>
>>>On February 22, 2005 at 12:40:52, Anthony Cozzie 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?
>>>>
>>>>100% untested.
>>>>
>>>>#include "stdio.h"
>>>>
>>>>int main(void)
>>>>{
>>>>	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},
>>>>fentable = {0, 'n', 'N'};
>>>>
>>>>	for(int i = 0; i < 4096; i++) {
>>>>		int wn = i & 0x3F, bn = i >> 6;
>>>>		if(wn == bn)
>>>>			continue;
>>>>		board[wn] = 1;
>>>>		board[bn] = 2;
>>>>
>>>>		for(int rank = 7; rank >= 0; rank--) {
>>>>			for(int file = 0, empty = 0; file < 8; file++) {
>>>>				if(empty && (board[rank*8+file] || file == 7)) {
>>>>					printf("%d", empty);
>>>>					empty = 0;
>>>>				}
>>>>				else
>>>>					empty++;
>>>>				if(board[rank*8+file])
>>>>					printf("%c", fentable[board[rank*8+file]]);
>>>>			}
>>>>			printf("/");
>>>>		}
>>>>
>>>>		printf(" - - 0 1\n");
>>>>		board[wn] = board[bn] = 0;
>>>>	}
>>>>}
>>>
>>>Your code seems to be with the best basis
>>>
>>>Here are correction to some bugs and hopefully there are no bugs left
>>>
>>>int main(void)
>>>{
>>>	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},
>>>fentable[3] = {0, 'n', 'N'};
>>>
>>>	for(int i = 0; i < 4096; i++) {
>>>		int wn = i & 0x3F, bn = i >> 6;
>>>		if(wn == bn)
>>>			continue;
>>>		board[wn] = 1;
>>>		board[bn] = 2;
>>>
>>>		for(int rank = 7; rank >= 0; rank--) {
>>>			for(int file = 0, empty = 0; file < 8; file++) {
>>>				if (board[rank*8+file])
>>>				{
>>>					if (empty>0)
>>>						printf("%d", empty);
>>>					printf("%c", fentable[board[rank*8+file]]);
>>>					empty = 0;
>>>				}
>>>				else
>>>				{
>>>					empty++;
>>>					if (file==7)
>>>						printf("%d", empty);
>>>				}
>>>
>>>			}
>>>			if (rank>0) printf("/");
>>>		}
>>>
>>>		printf(" - - 0 1\n");
>>>		board[wn] = board[bn] = 0;
>>>	}
>>>	return 0;
>>>}
>>
>>Better?
>>
>>#include "stdio.h"
>>
>>int main(void)
>>{
>>	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},
>>fentable = {0, 'n', 'N'};
>>
>>	for(int i = 0; i < 4096; i++) {
>>		int wn = i & 0x3F, bn = i >> 6;
>>		if(wn == bn)
>>			continue;
>>		board[wn] = 1;
>>		board[bn] = 2;
>>
>>		for(int rank = 7; rank >= 0; rank--) {
>>			for(int file = 0, empty = 0; file < 8; file++) {
>>				if(empty && (board[rank*8+file] || file == 7)) {
>>					printf("%d", empty+!board[rank*8+file]);
>>					empty = 0;
>>				}
>>				else
>>					empty++;
>>				if(board[rank*8+file])
>>					printf("%c", fentable[board[rank*8+file]]);
>>			}
>>			printf("/");
>>		}
>>
>>		printf(" - - 0 1\n");
>>		board[wn] = board[bn] = 0;
>>	}
>>}
>
>Not exactly.
>
>some improvement but again you repeat part of the same bugs that I fixed
>
>1)fentable[3] and not fentable
>2)you need return 0; because int needs to return a value
>3)printf("/"); should be done only in the first 7 ranks
>
>Uri

Here is a corrected code(30 lines)

#include "stdio.h"
int main(void)
{
	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},
	fentable[3] = {0, 'n', 'N'};
	for(int i = 0; i < 4096; i++) {
		int wn = i & 0x3F, bn = i >> 6;
		if(wn == bn)
			continue;
		board[wn] = 1;
		board[bn] = 2;
		for(int rank = 7; rank >= 0; rank--) {
			for(int file = 0, empty = 0; file < 8; file++) {
				if(empty && (board[rank*8+file] || file == 7)) {
					printf("%d", empty+!board[rank*8+file]);
					empty = 0;
				}
				else
					empty++;
				if(board[rank*8+file])
					printf("%c", fentable[board[rank*8+file]]);
			}
			if (rank>0)
				printf("/");
		}
		printf(" - - 0 1\n");
		board[wn] = board[bn] = 0;
	}
	return 0;
}

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.