Converter notação algébrica em notação descritiva

8

Short gosta de jogar xadrez. Short também é um homem muito tradicional. Portanto, o Sr. Short está perturbado com a recente tendência de usar a notação algébrica no xadrez moderno, e prefere usar a notação descritiva , como seu pai e o pai dele antes dele.

Nota

Para simplificar esse desafio, optei por não lidar com desambigüidades (como em quando duas peças podem se mover para o mesmo quadrado ou capturar a mesma peça.) Também não há como lidar com passantes, promoções ou castelos.

Notação algébrica para os não iniciados

  • Os quadrados do tabuleiro são numerados a1no canto inferior esquerdo para h8o canto superior direito. As letras representam os arquivos (colunas) enquanto os números representam as fileiras (linhas). O rei branco é colocado no início do jogo na praça e1.
  • Uma jogada consiste na peça que se moveu + no quadrado de destino. Por exemplo, um rei se mudando para e2seria Ke2.
  • Se a peça que se moveu for um peão, a letra da peça será omitida. Por exemplo, o movimento inicial de Peão para e4é escrito como e4.
  • Se a movimentação for uma captura, a xletra será inserida entre a peça e o quadrado de destino. Por exemplo, uma rainha capturando em f7é anotada como Qxf7.
  • Se a peça capturada é um peão, uma vez que se move na diagonal, a notação registra o arquivo do qual o peão se originou. Por exemplo, quando o Peão em c4captura uma peça em d5, o movimento é anotado como cxd5.
  • Os símbolos das peças são Kpara rei, Qrainha, Bbispo, Ncavaleiro e Rtorre. Os peões não têm símbolos.
  • Outras anotações incluem +para cheque e #para xeque-mate. Um peão movendo-se para f7 e dando check é f7+. Observe falta de espaço.

Notação descritiva para os não iniciados

  • Os arquivos são descritos pela peça que começa nele. Por exemplo, qual seria o earquivo em algébrico, se torna o arquivo King ou, resumidamente K,. Os outros arquivos são marcados ao lado e depois à peça. Então arquivo hé o arquivo da Torre do Rei, ou KR.
  • As classificações são numeradas do ponto de vista do jogador em movimento. Qual seria o quarto posto em Algebraic, é o quarto posto em branco, mas o quinto lugar em preto.
  • Daqui resulta que o quadrado e4é K4para o jogador branco e K5para o jogador preto. O quadrado f7é KB7para o jogador branco e KB2para o jogador preto.
  • Um movimento é anotado pela peça em movimento, depois um traço e o quadrado do alvo. Então, um peão de se mudar para K4é P-K4. A rainha de se mudar para KR5é Q-KR5.
  • Uma captura é anotada pela peça capturada e, em seguida x, pela peça capturada. Portanto, um bispo capturando um peão é BxP. Geralmente você precisa marcar qual peão está sendo capturado, mas ignore isso por uma questão de simplicidade.
  • Os símbolos das peças são Kpara Rei, QRainha, BBispo, KtCavaleiro (observe o símbolo diferente), RTorre e PPeão.
  • Outras anotações incluem chpara cheque e matepara xeque-mate. Um peão se movendo para KB7e dando o cheque é P-KB7 ch. Observe o espaço.

Entrada

Uma seqüência de notações algébricas se move, delineada por espaços. Não há números de movimento. Por exemplo, o companheiro do Louco fica assim:

f3 e5 g4 Qh4#

Ou o jogo Teed vs Delmar, da mesma página da Wikipedia:

d4 f5 Bg5 h6 Bf4 g5 Bg3 f4 e3 h5 Bd3 Rh6 Qxh5+ Rxh5 Bg6#

O jogo imortal .

e4 e5 f4 exf4 Bc4 Qh4+ Kf1 b5 Bxb5 Nf6 Nf3 Qh6 d3 Nh5 Nh4 Qg5 Nf5 c6 g4 Nf6 Rg1 cxb5 h4 Qg6 h5 Qg5 Qf3 Ng8 Bxf4 Qf6 Nc3 Bc5 Nd5 Qxb2 Bd6 Bxg1 e5 Qxa1+ Ke2 Na6 Nxg7+ Kd8 Qf6+ Nxf6 Be7#

Você pode assumir que a entrada é sempre um jogo válido. Todas as movimentações estão na ordem correta e nenhum dado estranho está presente. Nenhuma jogada incluirá desambiguação .

Por exemplo, o jogo Evergreen, apesar de obviamente ser um jogo válido, não será apresentado devido à 19ª jogada Rad1,.

Você também pode assumir que todas as listas de movimentação de entrada começam na posição inicial.

Resultado

Uma lista de movimentação, com um formato semelhante, em Notação descritiva.

Por exemplo, o companheiro do tolo:

P-KB3 P-K4 P-KKt4 Q-KR5 mate

Delmar vs Teed:

P-Q4 P-KB4 B-KKt5 P-KR3 B-KB4 P-KKt4 B-KKt3 P-KB5 P-K3 P-KR4 B-Q3 R-KR3 QxP ch RxQ B-KKt6 mate

O jogo imortal:

P-K4 P-K4 P-KB4 PxP B-QB4 Q-KR5 ch K-KB1 P-QKt4 BxP Kt-KB3 Kt-KB3 Q-KR3 P-Q3 Kt-KR4 Kt-KR4 Q-KKt4 Kt-KB5 P-QB3 P-KKt4 Kt-KB4 R-KKt1 PxB P-KR4 Q-KKt3 P-KR5 Q-KKt4 Q-KB3 Kt-KKt1 BxP Q-KB3 Kt-QB3 B-QB4 Kt-Q5 QxP B-Q6 BxR P-K5 QxR ch K-K2 Kt-QR3 KtxP ch K-Q1 Q-KB6 ch KtxQ B-K7 mate

Essa não é a notação descritiva mais simples possível, já que às vezes você não precisa especificar para qual arquivo Knight foi movido (como em, Q-KKt4pode ser gravado como é impossível Q-Kt4a movimentação Q-QKt4). A movimentação BxPé ambígua (que peão deve ser BxQKtP) , mas o Sr. Short não se importa muito com isso.

Você pode considerar esses casos de teste.

Nota: escrevi-os à mão. Se você detectar algum erro flagrante, entre em contato.

Regras e Pontuação

  • Regras padrão se aplicam: programa com saída para stdout ou função. Nada a stderr. As brechas padrão são proibidas.
  • Faça o link para um site onde podemos testar seu código.
  • Código de golfe: o código mais curto vence.

Em conclusão

Este é o meu primeiro desafio, então provavelmente cometi alguns erros noobish. O feedback sobre a pergunta (nos comentários, obviamente) é apreciado.

asibahi
fonte
3
Se você realmente deseja tempo para resolver os problemas do seu desafio e obter feedback ao mesmo tempo sem outros problemas, você pode publicá-lo como uma proposta na sandbox .
R. Kap
Grande primeiro desafio
edc65
I pensou notação descritiva seria E2-E4 e NG1-F3 (por E4 e Cf3 respectivamente de posição inicial)
ericw31415

Respostas:

2

Lote, 554 bytes

@echo off
for %%r in (a.R b.Kt c.B d.Q e.K f.B g.Kt h.R)do set %%~nr1=%%~xr&set %%~nr8=%%~xr
for %%r in (a b c d e f g h)do set %%r2=.P&set %%r7=.P
set s=
:l
set m=%1
set c=
for %%r in (ch.+ mate.#) do if .%m:~-1%==%%~xr set c= %%~nr&set m=%m:~0,-1%
set p=%m:~0,1%
for %%r in (a b c d e f g h)do if %p%==%%r set p=P
for %%r in (QR.a QKt.b QB.c Q.d K.e KB.f KKt.g KR.h)do if .%m:~-2,1%==%%~xr set d=-%%~nr%m:~-1%
if %m:~-3,1%==x call set d=x%%%m:~-2%:~1%%
set %m:~-2%=.%p:N=Kt%
set s=%s% %p:N=Kt%%d%%c%
shift
if not "%1"=="" goto l
echo%s%

sé a sequência de saída. mé a movimentação atual (as movimentações são tomadas como parâmetros da linha de comando). cé o sinalizador chou mate. pé a peça atual. Se não houver nenhuma peça (ou seja, uma letra minúscula a-h), ela Pserá substituída. (A substituição Npara Kté feita posteriormente para salvar bytes.) A coluna de destino é pesquisada em um dicionário. No entanto, se o movimento for realmente uma captura, o destino se tornará um xseguido pela peça anteriormente naquele quadrado. De qualquer maneira, o quadrado de destino é definido como a peça que acabou de se mover para lá. Os movimentos são acumulados até que não haja mais parâmetros e depois são impressos.

As variáveis a1... h8são usadas para armazenar a última peça vista. O .prefixo está lá devido à maneira como inicializo a linha de trás; é difícil fazer um loop sobre duas variáveis ​​ao mesmo tempo no Lote, a menos que eu possa começar uma com a ..

Neil
fonte