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.01 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.