Dada uma grade de letras 8x8 que representa o estado atual de um jogo de xadrez, a tarefa do seu programa é encontrar um próximo movimento para o branco que resulte em xeque-mate (a resposta sempre será conjunta em um movimento).
Entrada
A entrada será em STDIN - 8 linhas de 8 caracteres cada. Os significados de cada caractere são os seguintes:
K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square
Letras maiúsculas representam peças brancas e letras minúsculas representam preto. O tabuleiro será orientado para que o branco seja reproduzido por baixo e o preto seja reproduzido por cima.
Resultado
Uma mudança para o branco que resulta em xeque-mate, em notação algébrica . Você não precisa anotar quando uma peça foi tirada, nem precisa se preocupar em desambiguar entre duas peças idênticas que podem fazer o mesmo movimento.
Entrada de amostra
Exemplo 1
Entrada:
------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------
Resultado:
c6
Exemplo 2
Entrada:
--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-
Resultado:
Nf5
Exemplo 3
Entrada:
---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-
Resultado:
Rh5
Você pode presumir que a solução não envolverá roque ou en-passant.
Este é o código-golfe - a solução mais curta vence.
(Exemplos retirados de mateinone.com - quebra-cabeças 81, 82 e 83)
Respostas:
Ruby,
589512510499493 caracteresA entrada é fornecida via stdin, por exemplo:
O resultado não é apenas um movimento que força um parceiro em um, mas todos os movimentos que o fazem.
Edit 1: A função
e
foi usada apenas uma vez, então eu a inline. Segundo, a codificação agora é baseada no número 5 em vez de 10. E refatorar a clonagem do quadro salvou alguns caracteres.Edit 2: Ainda não há tantas melhorias quanto eu queria. Alterando o hash de
{a=>b,c=>d}
paraHash[a,b,c,d]
. Isso custa 4 caracteres, mas salva um por par de valor-chave.Edit 3: Apenas pequenas reduções: inline M (4 caracteres),
t==?-
->t<?.
(2), removendo Pawn em notação algébrica no final (2), substituídos put (3). O programa agora tem menos de 500 caracteres.Edit 4: É interessante o quanto ainda podemos encontrar em um programa como esse. Moveu uma invariante fora do loop e encontrou outro cálculo duplicado.
fonte
[*$<]
vez de$<.map{|l|l}
.