Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Harder than I thought...

Author: Robert Hyatt

Date: 08:46:24 02/10/06

Go up one level in this thread


On February 10, 2006 at 07:04:19, h.g.muller wrote:

>This one seems to do it. It took me 70 miniutes, (without cheating or debugger),
>so the other 3 problems better be really easy compared to this one...
>
>int vectors[] = {16,15,17,0,-16,-15,-17,0,1,-1,16,-16,0,
>                 1,-1,16,-16,15,-15,17,-17,0,
>                 14,-14,18,-18,31,-31,33,-33,0};
>int firstdir[] = {2,-1,3,21,12,16,7,12};
>
>char board[128];
>int orig, targ;
>
>int negamax(int color, int depth)
>{
>        int origsqr, targsqr, bestorig, besttarg, score, bestscore,
>            piece, piecetype, victim, dirnr, stepvec;
>
>        bestscore = depth<=1 ? 0 : -2;
>
>        for(origsqr=0; origsqr<128; origsqr = (origsqr+9) & ~8)
>        {
>            piece = board[origsqr];
>            piecetype = piece&7;
>            if(piece&color)
>            {
>                dirnr = firstdir[piecetype];
>                while(stepvec = vectors[++dirnr])
>                {
>                    targsqr = origsqr;
>                    do {
>                        targsqr += stepvec;
>                        if(targsqr & 0x88) break;
>                        victim = board[targsqr];
>                        if(victim & color) break;
>                        if(piecetype<3 &&
>                           ( (victim==0) != ((stepvec&7)==0) )
>                          ) break;
>
>                        if((victim&7) == 4) {bestscore = 2; goto cutoff;}
>
>                        if(depth>1)
>                        {
>                            board[origsqr] = 0; board[targsqr] = piece;
>                            score = -negamax(24-color, depth-1);
>                            board[origsqr] = piece; board[targsqr] = victim;
>                            /*printf("%d: (%2x,%2x) %d %d\n", depth, origsqr,
>targsqr, score, bestscore);/**/
>
>                            if(score>bestscore)
>                            {
>                                bestscore = score;
>                                bestorig = origsqr;
>                                besttarg = targsqr;
>                            }
>                        }
>                        victim += (piecetype < 5);
>                    } while(victim==0);
>                }
>            }
>        }
>        if(bestscore == -1)
>            bestscore = -negamax(24-color, 0)/2;
>cutoff:
>        orig = bestorig;
>        targ = besttarg;
>        return bestscore;
>}
>
>int main(void)
>{
>        int i, j, k, s;
>        char buf[80], c;
>
>        for(i=0;i<128;i+=16)
>        {
>            for(j=0;j<8;j++)
>            {   c = getchar();
>                k=8;
>                if(c>='a') {c += 'A'-'a'; k=16;}
>                switch(c)
>                {
>                case 'K': s=4; break;
>                case 'Q': s=7; break;
>                case 'R': s=6; break;
>                case 'B': s=5; break;
>                case 'N': s=3; break;
>                case 'P': s=k==8?1:2; break;
>                case '.': s=0; break;
>                default: printf("bad piece %c at %d,%d\n",c,i,j); exit(0);
>                }
>                if(s) s+= k;
>                board[i+j] = s;
>            }
>            if(getchar() != '\n') {printf("bad format\n"); exit(0);}
>        }
>
>        for(i=2;i<=4;i+=2)
>            if(negamax(8,i+1))
>            {
>                printf("mate in %d by %c%c%c%c\n", i/2,
>                        (orig&7)+'a', (orig>>4)+'1',
>                        (targ&7)+'a', (targ>>4)+'1');
>                exit(0);
>            }
>        printf("no mate found\n");
>}


Another note.  Your above solution would be returned "incorrect".  The
directions, as given previously, were to print the _position_ after making the
mate in 1 move.  Not print the move that mates.  You would get the assignment
returned, marked "incorrect" but they do _not_ tell you why it is wrong.  They
might say "it crashed" or "the output is incorrect" but that is all you get.
That's part of the "fun" of these events.  We run them here regularly.




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.