El árbitro de ajedrez más pequeño

8

Escriba un programa que, al mirar una mesa de ajedrez, pueda decir si hay un cheque o un jaque mate.

Entrada : una tabla de ajedrez en forma de texto, siendo la última línea de entrada la primera fila (la línea de inicio de las blancas)

La posición inicial en esta entrada se vería así (el espacio es un cuadrado vacío, las letras mayúsculas son blancas): ¿por qué no se muestran los espacios aquí?

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

El programa debe imprimir uno o más de los siguientes (sin comillas, por supuesto), dependiendo de la situación:

  • "¡El Rey Blanco está bajo control!" (si ya está en jaque mate, ¡no muestres esto!)
  • "¡El Rey Negro está bajo control!" (si ya está en jaque mate, ¡no muestres esto!)
  • "¡El Rey Blanco está en jaque mate!"
  • "¡El Rey Negro está en jaque mate!"
  • "¡White está en un punto muerto!" (Habría un estancamiento si las blancas se mudaran - opcional )
  • "¡Black está en un punto muerto!" (Habría un estancamiento si las negras se movieran - opcional )
  • "Ambos reyes están a salvo por ahora". (si no se aplica ninguno de los anteriores)

Se garantiza que la entrada sea correcta y sea una posición legal de ajedrez (no hay dos reyes del mismo color, no hay dos reyes bajo control, etc.).

Puntuación:

El puntaje es el recuento de caracteres, las victorias más bajas, no antes de 10 días después de la primera respuesta válida. Si se implementa la evaluación opcional de estancamiento, el tamaño se reducirá en un 20% (para esta situación, suponga que no se puede realizar la transferencia).

vsz
fuente
Creo que el punto muerto puede depender de quién se moverá (es decir, podría moverme sin control a una posición que sería un punto muerto, excepto que ahora es el turno de mi oponente para moverse y tendrá que cambiar algo). Intentaré fabricar tal estado.
dmckee --- ex gatito moderador el
@dmckee: Por eso separé el blanco y el negro. Debe imprimir "el blanco está en punto muerto" si hubiera un punto muerto si se moviera el blanco. Lo editaré para que quede más claro.
vsz
¿Qué pasa con el estancamiento incondicional (por ejemplo, solo quedan reyes en el tablero)? Editar: ah, "uno o más". Aún así, sería bueno incluir esto en los casos de prueba que estoy seguro de que va a agregar.
Peter Taylor
1
@PeterTaylor: Bueno, técnicamente no son un punto muerto. En esa ocasión, tendríamos que incluir el Rey + un Caballero o el Obispo contra el Rey, que también es un empate. Y luego el cheque eterno. Y así. Ok, si quieres implementarlo (¿y el compañero inevitable en x también?) Eres libre de hacerlo, pero no haré que sean un requisito estricto. Entonces, en ese caso, aceptaré "Ambos reyes están a salvo por ahora". salida en caso de que solo queden reyes a bordo.
vsz
3
¿Qué pasa si el cheque fue hecho por un peón elegibles para al paso de captura? ¿Es seguro asumir que esto no ocurre?
Steven Rumbalski el

Respuestas:

5

C, 837-20% = 669.6 caracteres

Basado en esta respuesta . Puede ver algunas explicaciones sobre la implementación allí.
El original se juega bastante bien, las modificaciones no tanto, por lo que hay margen de mejora.
Tampoco me sorprendería encontrar errores, mi control de calidad no fue muy riguroso.

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
fuente