Wasit Catur terkecil

8

Tulis sebuah program, yang, ketika menatap meja catur, dapat mengatakan apakah ada cek atau skakmat.

Input : tabel catur dalam bentuk teks, baris terakhir dari input menjadi peringkat pertama (garis awal White)

Posisi awal dalam input ini akan terlihat seperti ini (spasi adalah kuadrat kosong, huruf kapital berwarna Putih): mengapa spasi tidak ditampilkan di sini?

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

Program harus mencetak satu atau lebih dari yang berikut ini (tanpa tanda kutip, tentu saja), tergantung pada situasinya:

  • "Raja Putih sedang dikendalikan!" (jika sudah dalam skakmat, jangan tampilkan ini!)
  • "Raja Hitam sedang dikendalikan!" (jika sudah dalam skakmat, jangan tampilkan ini!)
  • "Raja Putih sedang dalam skakmat!"
  • "Raja Hitam sedang dalam skakmat!"
  • "Putih dalam kebuntuan!" (Akan ada jalan buntu jika Putih dipindahkan - opsional )
  • "Hitam dalam kebuntuan!" (Akan ada jalan buntu jika Hitam pindah - opsional )
  • "Kedua raja aman untuk saat ini." (jika tidak ada yang di atas berlaku)

Masukan dijamin benar dan menjadi posisi catur legal (tidak ada dua raja dengan warna yang sama, tidak ada dua raja dalam pemeriksaan, dll.).

Skor:

Skor adalah jumlah karakter, kemenangan terendah, tidak lebih cepat dari 10 hari setelah jawaban valid pertama. Jika evaluasi jalan buntu opsional diterapkan, ukurannya akan berkurang sebesar 20% (untuk situasi ini, anggaplah penumpang tidak dapat melakukan).

vsz
sumber
Saya percaya bahwa kebuntuan dapat bergantung pada siapa yang harus bergerak (yaitu saya bisa pindah dari cek ke posisi yang akan macet kecuali bahwa sekarang lawan saya berbalik untuk bergerak dan dia harus mengubah sesuatu). Saya akan mencoba untuk membuat kondisi seperti itu.
dmckee --- ex-moderator kitten
@ dmckee: Inilah mengapa saya memisahkan putih dan hitam. Anda harus mencetak "white is in stalemate" jika akan ada kebuntuan jika putih dipindahkan. Saya akan mengeditnya agar lebih jelas.
vsz
Bagaimana dengan kebuntuan tanpa syarat (mis. Hanya raja yang tersisa di papan tulis)? Edit: ah, "satu atau lebih". Namun, akan lebih baik untuk memasukkan ini dalam kasus uji yang saya yakin akan Anda tambahkan.
Peter Taylor
1
@ PeterTaylor: Yah mereka secara teknis tidak jalan buntu. Satu kesempatan itu, kita harus menyertakan Raja + satu Ksatria atau Uskup vs Raja, yang juga merupakan hasil imbang. Dan kemudian cek abadi. Dan seterusnya. Ok, Jika Anda ingin mengimplementasikannya (dan pasangan yang tidak dapat dihindari dalam x juga?) Anda bebas untuk melakukannya, tapi saya tidak akan membuatnya dengan persyaratan yang ketat. Jadi dalam hal ini saya akan menerima "Kedua raja aman untuk saat ini." output dalam kasus hanya raja yang tersisa di kapal.
vsz
3
Bagaimana jika cek dilakukan oleh pegadaian yang memenuhi syarat untuk ditangkap secara pasif ? Apakah aman untuk menganggap ini tidak terjadi?
Steven Rumbalski

Jawaban:

5

C, 837-20% = 669,6 karakter

Berdasarkan jawaban ini . Anda dapat melihat beberapa penjelasan tentang implementasi di sana.
Asli golf cukup baik, modifikasinya tidak begitu banyak, jadi ada ruang untuk perbaikan.
Saya juga tidak akan terkejut menemukan bug, QA saya tidak terlalu ketat.

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
sumber