Gioco di scacchi: White to Mate In One


19

Data una griglia di lettere 8x8 che rappresenta lo stato attuale di una partita a scacchi, il compito del programma è quello di trovare una mossa successiva per il bianco che si traduca in scacco matto (la risposta sarà sempre l'accoppiamento in una mossa).

Ingresso

L'ingresso sarà su STDIN - 8 righe di 8 caratteri ciascuna. I significati di ciascun personaggio sono i seguenti:

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

Le lettere maiuscole rappresentano i pezzi bianchi e le lettere minuscole rappresentano il nero. Il tabellone sarà orientato in modo che il bianco giochi dall'alto e il nero dall'alto.

Produzione

Una mossa per il bianco che si traduce in scacco matto, in notazione algebrica . Non è necessario annotare quando è stato preso un pezzo, né è necessario preoccuparsi di chiarire le ambiguità tra due pezzi identici che possono fare la stessa mossa.

Input di esempio

Esempio 1

Ingresso:

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

Produzione:

c6

Esempio 2

Ingresso:

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

Produzione:

Nf5

Esempio 3

Ingresso:

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

Produzione:

Rh5

Puoi presumere che la soluzione non coinvolgerà castling o en-passant.

Questo è code-golf - vince la soluzione più breve.

(Esempi tratti da mateinone.com - puzzle 81, 82 e 83)


No. Penso che, ai fini di questa domanda, si possa presumere che la risposta non riguarderà il castling o l'invasore. Aggiornerò la domanda.
Gareth,

Come dovremmo gestire le posizioni con più di un compagno in uno?
Rob,

@Rob È necessaria solo una soluzione, quindi emetti la soluzione che trovi per prima.
Gareth,

È anche sicuro supporre che la soluzione non implichi la promozione?
Peter Taylor,

@Peter Sì, non voglio complicare eccessivamente il problema.
Gareth,

Risposte:


7

Rubino, 589 512 510 499 493 caratteri

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]+/]}

L'immissione viene fornita tramite stdin, ad es .:

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

L'output non è solo una mossa che forza un compagno in una, ma ogni mossa che lo fa.

Modifica 1: la funzione è estata utilizzata solo una volta, quindi l'ho inclusa. In secondo luogo, la codifica ora si basa sul numero 5 anziché su 10. E il refactoring della clonazione della scheda ha consentito di risparmiare parecchi caratteri.

Modifica 2: Ancora non tanto il miglioramento che volevo. Cambiare l'hash da {a=>b,c=>d}a Hash[a,b,c,d]. Questo costa 4 caratteri ma ne salva uno per coppia chiave-valore.

Modifica 3: solo riduzioni minori: allineamento di M (4 caratteri), t==?--> t<?.(2), rimozione di Pedone in notazione algebrica alla fine (2), sostituzione di put (3). Il programma ora ha meno di 500 caratteri.

Modifica 4: È interessante quanto si possa ancora trovare in un tale programma. Spostato un invariante fuori dal ciclo e trovato un altro calcolo duplicato.


Per "non uno, ma qualsiasi" intendi "non necessariamente uno, ma ogni"?
Matteo Leggi il

@Matthew hai ragione. Intendevo "ogni".
Howard,

Puoi usare [*$<]invece di $<.map{|l|l}.
Lowjacker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.