チェスの終盤:ホワイトトゥメイトインワン


19

チェスのゲームの現在の状態を表す8x8の文字のグリッドが与えられた場合、プログラムのタスクは、チェックメイトをもたらす白の次の動きを見つけることです(答えは常に1つの動きで合致します)。

入力

入力は、STDIN-8文字の8行で行われます。各文字の意味は次のとおりです。

K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square

大文字は白い部分を表し、小文字は黒を表します。ボードは、白が下から上に、黒が上から下に向かって再生されるように配置されます。

出力

代数記法でチェックメイトになる白の動き。ピースが取られたときに表記する必要はありません。また、同じ動きをすることができる2つの同一のピース間の曖昧さを解消することを心配する必要もありません。

サンプル入力

例1

入力:

------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------

出力:

c6

例2

入力:

--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-

出力:

Nf5

例3

入力:

---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-

出力:

Rh5

ソリューションにはキャスティングや同伴者は含まれないと想定できます。

これはコードゴルフです-最短のソリューションが勝ちます。

mateinone.comからの例-パズル81、82、83)


いいえ。この質問の目的のために、あなたは答えがキャスティングや共感者を伴わないと仮定できると思います。質問を更新します。
ガレス

複数のメイトインワンのポジションをどのように処理する必要がありますか?
ロブ

@Rob必要なソリューションは1つだけなので、最初に見つかったソリューションを出力します。
ガレス

ソリューションにプロモーションが含まれないと想定することも安全ですか?
ピーターテイラー

@Peterはい、問題を過度に複雑にしたくありません。
ガレス

回答:


7

ルビー、589 512 510 499 493文字

R=0..7
a=->b{o=[];R.map{|r|R.map{|c|v=Hash[?K,[6,7,8,11,13,16,17,18],?R,s=[157,161,163,167],?B,t=[156,158,166,168],?Q,s+t,?N,[1,3,5,9,15,19,21,23],?P,[32,181,183]][z=b[r][c]];v&&v.map{|s|k=2!=l=s/25+1;u=r;v=c;l.times{u+=s/5%5-2;v+=s%5-2;R===u&&R===v||break;t=b[u][v];j=t<?.&&l<8;(j||t=~/[a-z]/&&k)&&o<<=(h=b.map &:swapcase;h[u][v]=h[r][c];h[r][c]=?-;[z+"%c%d"%[97+v,8-u],h.reverse]);j&&(k||r==6)||break}}}};o}
a[$<.map{|l|l}].map{|m,b|a[b].any?{|f,x|a[x].all?{|g,y|y*""=~/K/}}||$><<m[/[^P]+/]}

入力は標準入力を介して与えられます。例:

> ruby mateinone.rb
--------
--------
--------
-k------
b-------
-N-P----
--------
-----K-Q
^Z
Qb7

出力は、1つの合致を強制する1つの動きだけでなく、そうするすべての動きです。

編集1:関数e1回だけ使用されたため、インライン化しました。次に、エンコードは10ではなく5に基づいています。また、ボードのクローンをリファクタリングすると、かなりの文字数が節約されました。

編集2:まだ私が望んだほど改善されていません。ハッシュをから{a=>b,c=>d}に変更しHash[a,b,c,d]ます。これには4文字かかりますが、キーと値のペアごとに1つ節約できます。

編集3:マイナーリダクションのみ:インラインM(4文字)、t==?--> t<?.(2)、代数表記のポーンを最後に削除(2)、プットを置き換え(3)。プログラムは現在、500文字未満です。

編集4:このようなプログラムでどれだけ多くを見つけることができるかは興味深いです。不変式をループ外に移動し、別の重複した計算を見つけました。


「1つではなく、すべて」とは、「必ずしも1つではなくすべて」を意味しますか?
マシュー

@マシューあなたは正しい。私は「すべて」を意味しました。
ハワード

[*$<]代わりに使用できます$<.map{|l|l}
ロージャッカー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.