Author: Uri Blass
Date: 11:06:28 02/22/05
Go up one level in this thread
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
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.