O menor árbitro de xadrez

8

Escreva um programa que, ao olhar para uma mesa de xadrez, possa dizer se existe um cheque ou um xeque-mate.

Entrada : uma tabela de xadrez em forma de texto, a última linha da entrada sendo a primeira classificação (a linha inicial de Branco)

A posição inicial nesta entrada ficaria assim (o espaço é um quadrado vazio, as letras maiúsculas são brancas): por que os espaços não são exibidos aqui?

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

O programa deve imprimir um ou mais dos seguintes itens (sem aspas, é claro), dependendo da situação:

  • "O rei branco está em xeque!" (se já estiver no xeque-mate, não exiba isso!)
  • "O rei negro está em xeque!" (se já estiver no xeque-mate, não exiba isso!)
  • "O rei branco está em xeque-mate!"
  • "O rei negro está em xeque-mate!"
  • "Branco está em impasse!" (Haveria um impasse se as brancas se movessem - opcional )
  • "Preto está em impasse!" (Haveria um impasse se as pretas se movessem - opcional )
  • "Ambos os reis estão seguros por enquanto." (se nenhuma das opções acima se aplicar)

A entrada é garantida como correta e é uma posição legal no xadrez (não há dois reis da mesma cor, não há dois reis em xeque, etc.).

Ponto:

A pontuação é a contagem de caracteres, vitórias mais baixas, não antes de 10 dias após a primeira resposta válida. Se a avaliação opcional do impasse for implementada, o tamanho será reduzido em 20% (para esta situação, suponha que o passante não possa ser executado).

vsz
fonte
Acredito que o impasse pode depender de quem deve se mover (ou seja, eu poderia sair do campo para uma posição que seria impasse, exceto que agora é o meu oponente se mudar e ele terá que mudar alguma coisa). Vou tentar fabricar esse estado.
dmckee --- gatinho ex-moderador
@dmckee: É por isso que eu meparei branco e preto. Você precisa imprimir "o branco está em impasse" se houver um impasse se o branco for movido. Vou editá-lo para torná-lo mais claro.
Vsz 07/07
E o impasse incondicional (por exemplo, apenas reis restantes no quadro)? Edit: ah, "um ou mais". Ainda assim, seria bom incluir isso nos casos de teste que tenho certeza de que você adicionará.
Peter Taylor
1
@ PeterTaylor: Bem, eles não são tecnicamente um empate. Numa ocasião, teríamos que incluir o rei + um cavaleiro ou bispo vs rei, que também é um empate. E então a verificação eterna. E assim por diante. Ok, se você deseja implementá-lo (e o inevitável companheiro em x também?), Você é livre para fazê-lo, mas eu não os obrigarei a um requisito estrito. Portanto, nesse caso, aceitarei o "Ambos os reis estão seguros por enquanto". saída no caso de apenas reis a bordo.
Vsz 07/07
3
E se a verificação foi feita por um peão qualificado para captura em passante ? É seguro assumir que isso não ocorre?
9118 Steven Rumbalski #

Respostas:

5

C, 837-20% = 669,6 caracteres

Com base nesta resposta . Você pode ver algumas explicações sobre a implementação lá.
O original é muito bem jogado, as modificações nem tanto, então há espaço para melhorias.
Eu também não ficaria surpreso ao encontrar bugs, meu controle de qualidade não era muito rigoroso.

char*r=" KPNBRQ  kpnbrq $ ,&)$wxy()879()8(6:GI(",B[256],*b=B,i,Q,s,*X[]={"Stalemate","Checkmate","","Check"};
e(x,d,m,V,c,r,n,p){
    p=b[x];
    return(m/r?
        n=x+d*r,
        p-2-8*(d<0)&&!(n&136)&&(b[n]?r=8,p&8^b[n]&8&&c&65^64:c&65^65)&&
        ((V?v(n,x):b[n]%8==1&&(s&=~((b[n]>7?8:2)))),e(x,d,m,V,c,r+1))
    :0)||d>0&&e(x,-d,m,V,c,1);
}
d(x,v,m,i)char*m;{
    (i=*m-40)? e(x,i%64,b[x]%8-2?b[x]&4?7:1:(x/16-1)%5|i%2?1:2,v,i,1),d(x,v,m+1):0;
}
v(t,f){
    b[t]%8-1?
        (s&(b[f]>7?8:2))==0?
            bcopy(B,b+=128,128),
            s|=(b[f]>7?8:2),
            b[f]^=b[t]=b[f],
            a(b[t]<8,63),
            b=B
        :0
    :
        (s|=b[f]>7?1:4);
}
a(c,n){
    b[i=n*2-n%8]&&b[i]/8==c?d(i,!Q++,r+r[b[i]%8+15]-10),Q--:0;n--&&a(c,n);
}
p(c,t){
    return(t=c?s%4:s/4)!=2&&printf("%s%s%s is in %s\n",t?"The ":"",c?"White":"Black",t?" king":"",X[t]);
}
main(){
    for(;gets(b);b+=8)for(;*b;b++)*b=strchr(r,*b)-r;b=B;
    a(0,63);
    a(1,63);
    p(0)||p(8)||puts("Both kings are safe for now");
}
Ugoren
fonte