Der kleinste Schachschiedsrichter

8

Schreiben Sie ein Programm, das beim Blick auf einen Schachtisch sagen kann, ob es einen Scheck oder einen Schachmatt gibt.

Eingabe : Eine Schachtabelle in Textform, wobei die letzte Zeile der Eingabe der erste Rang ist (die Startzeile von Weiß).

Die Startposition in dieser Eingabe würde folgendermaßen aussehen (Leerzeichen ist ein leeres Quadrat, Großbuchstaben sind Weiß): Warum werden die Leerzeichen hier nicht angezeigt?

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

Das Programm sollte je nach Situation eine oder mehrere der folgenden Angaben machen (natürlich ohne Anführungszeichen):

  • "Der weiße König ist in Schach!" (Wenn Sie bereits Schachmatt haben, zeigen Sie dies nicht an!)
  • "Der schwarze König ist in Schach!" (Wenn Sie bereits Schachmatt haben, zeigen Sie dies nicht an!)
  • "Der weiße König ist in Schachmatt!"
  • "Der schwarze König ist in Schachmatt!"
  • "Weiß ist in einer Pattsituation!" (Es würde eine Pattsituation geben, wenn Weiß umziehen würde - optional )
  • "Schwarz ist in einer Pattsituation!" (Es würde eine Pattsituation geben, wenn Schwarz sich bewegen würde - optional )
  • "Beide Könige sind vorerst in Sicherheit." (wenn keiner der oben genannten Punkte zutrifft)

Die Eingabe ist garantiert korrekt und eine legale Schachposition (keine zwei Könige derselben Farbe, keine zwei Könige in Schach usw.).

Ergebnis:

Die Punktzahl ist die Anzahl der Charaktere, der niedrigste Gewinn, frühestens 10 Tage nach der ersten gültigen Antwort. Wenn die optionale Patt-Bewertung implementiert ist, wird die Größe um 20% verringert (in dieser Situation wird davon ausgegangen, dass kein Passant durchgeführt werden kann).

vsz
quelle
Ich glaube, dass eine Pattsituation davon abhängen kann, wer sich bewegen soll (dh ich könnte außer Kontrolle geraten in eine Position, die eine Pattsituation wäre, außer dass jetzt mein Gegner an der Reihe ist, sich zu bewegen, und er etwas ändern muss). Ich werde versuchen, einen solchen Zustand herzustellen.
dmckee --- Ex-Moderator Kätzchen
@dmckee: Deshalb habe ich weiß und schwarz getrennt. Sie müssen "Weiß ist in einer Pattsituation" drucken, wenn es eine Pattsituation geben würde, wenn sich Weiß bewegt. Ich werde es bearbeiten, um es klarer zu machen.
vsz
Was ist mit einer bedingungslosen Pattsituation (z. B. nur noch Könige auf dem Brett)? Edit: ah, "eins oder mehrere". Trotzdem wäre es gut, dies in die Testfälle aufzunehmen, die Sie sicher hinzufügen werden.
Peter Taylor
1
@ PeterTaylor: Nun, sie sind technisch gesehen keine Pattsituation. Bei dieser Gelegenheit müssten wir den König + einen Ritter oder Bischof gegen König einbeziehen, was ebenfalls ein Unentschieden ist. Und dann die ewige Prüfung. Und so weiter. Ok, wenn Sie es implementieren möchten (und den unvermeidlichen Partner in x auch?), Können Sie es tun, aber ich werde sie nicht zu einer strengen Anforderung machen. In diesem Fall akzeptiere ich "Beide Könige sind vorerst in Sicherheit". Ausgabe nur bei Königen, die noch an Bord sind.
vsz
3
Was ist, wenn der Scheck von einem Bauern ausgestellt wurde, der für die en passant Gefangennahme berechtigt ist ? Ist es sicher anzunehmen, dass dies nicht der Fall ist?
Steven Rumbalski

Antworten:

5

C 837-20% = 669,6 Zeichen

Basierend auf dieser Antwort . Dort finden Sie einige Erklärungen zur Implementierung.
Das Original ist ziemlich gut golfen, die Modifikationen nicht so sehr, also gibt es Raum für Verbesserungen.
Ich wäre auch nicht überrascht, Fehler zu finden, meine Qualitätssicherung war nicht sehr streng.

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
quelle