最小のチェスアービター


8

チェスのテーブルを見ると、小切手またはチェックメイトの有無を確認できるプログラムを作成します。

入力:テキスト形式のチェステーブル。入力の最後の行は最初のランク(白の開始行)です。

この入力の開始位置は次のようになります(スペースは空の四角形、大文字は白です)。ここにスペースが表示されないのはなぜですか?

rnbqkbnr
pppppppp




PPPPPPPP
RNBQKBNR

プログラムは、状況に応じて、次の1つ以上を(もちろん引用符なしで)印刷する必要があります。

  • 「ホワイトキングがチェック中!」(すでにチェックメイトの場合は、これを表示しないでください!)
  • 「ブラックキングがチェックされています!」(すでにチェックメイトの場合は、これを表示しないでください!)
  • 「ホワイトキングはチェックメイトです!」
  • 「ブラックキングはチェックメイトです!」
  • 「白は行き詰まっている!」(ホワイトが移動した場合、行き詰まりが発生します- オプション
  • 「黒は行き詰まっている!」(黒が移動した場合、行き詰まりが発生します- オプション
  • 「どちらの王も今のところ安全です。」(上記のいずれにも該当しない場合)

入力は正確であり、正当なチェスの位置であることが保証されています(同じ色の2人の王がいない、2人の王がチェックされていない、など)。

スコア:

スコアは、最初の有効な回答から10日以内の文字数、最低の勝ちです。オプションのステイルメイト評価が実装されている場合、サイズは20%減少します(この状況では、en-passantを実行できないと想定します)。


行き詰まりは、誰が移動するかによって決まると考えています(つまり、対戦相手が移動するターンになり、何かを変更する必要がある場合を除いて、行き詰まりの状態になる可能性があります)。そんな状態を作ってみます。
dmckee ---元モデレーターの子猫2012

@dmckee:これが私が白と黒を分離した理由です。白が動いた場合に行き詰まりがある場合は、「白は行き詰まっている」と印刷する必要があります。わかりやすくするために編集します。
vsz

無条件の行き詰まりはどうですか(たとえば、ボードに残っている王のみ)。編集:ああ、「1つ以上」。それでも、これを追加するテストケースに含めるとよいでしょう。
Peter Taylor

1
@PeterTaylor:技術的に行き詰まりではありません。その場合、私たちはキング+ 1騎士またはビショップvsキングを含める必要があり、これも引き分けです。そして、永遠のチェック。等々。わかりました、それを実装したい場合(そしてxの避けられない仲間も?)あなたはそれを自由にできますが、私はそれらを厳密な要件にするつもりはありません。その場合、私は「両方の王は今のところ安全です」を受け入れます。ボードにキングのみが残っている場合の出力。
vsz

3
チェックがエンパッサントキャプチャーの対象となるポーンによって行われた場合はどうなりますか?これが発生しないと仮定しても安全ですか?
Steven Rumbalski

回答:


5

C、837-20%= 669.6文字

この回答に基づく。そこでの実装に関するいくつかの説明を見ることができます。
オリジナルはかなりよくゴルフされており、修正はそれほど多くないので、改善の余地があります。
また、バグを見つけても驚かないでしょう。私のQAはそれほど厳密ではありませんでした。

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");
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.