Convertir notación algebraica a notación descriptiva

8

Al Sr. Short le gusta jugar ajedrez. Short también es un hombre muy tradicional. Por lo tanto, el Sr. Short está perturbado por la tendencia reciente de usar la notación algebraica en el ajedrez moderno, y preferiría usar la notación descriptiva , como su padre y el padre de su padre antes que él.

Nota

Para simplificar este desafío, elegí no lidiar con desambiguaciones (como en, cuando dos piezas pueden moverse a la misma casilla, o pueden capturar la misma pieza). Tampoco hay que lidiar con pasatiempo, promoción o enroque.

Notación algebraica para los no iniciados

  • Los cuadrados del tablero están numerados desde a1abajo a la izquierda hasta h8arriba a la derecha. Las letras representan los archivos (columnas) mientras que los números representan los rangos (filas). El Rey blanco se coloca al comienzo del juego en la plaza e1.
  • Un movimiento consiste en la pieza que se movió + el cuadrado de destino. Por ejemplo, un Rey que se muda a e2sería Ke2.
  • Si la pieza que se movió es un Peón, se omite la letra de la pieza. Por ejemplo, el movimiento inicial a Peón e4se escribe como e4.
  • Si el movimiento es una captura, entonces la xletra se inserta entre la pieza y el cuadrado de destino. Por ejemplo, una Reina capturando en f7se anota como Qxf7.
  • Si la pieza de captura es un Peón, ya que se mueve en diagonal, la notación registra el archivo del cual se originó el Peón. Por ejemplo, cuando el Peón en c4captura una pieza en d5, el movimiento se anota como cxd5.
  • Los símbolos de pieza son Kpara Rey, Qpara Reina, Bpara Obispo, Npara Caballero y Rpara Torre. Los peones no tienen símbolos.
  • Otras anotaciones incluyen +para cheque y #para jaque mate. Un peón moviéndose a f7 y dando cheque es f7+. Tenga en cuenta la falta de espacio.

Notación descriptiva para los no iniciados

  • Los archivos se describen por la pieza que comienza en él. Por ejemplo, lo que sería el earchivo en Algebraic, se convierte en el archivo King o, para abreviar K,. Los otros archivos están marcados por su lado, luego la pieza. Entonces file hes el archivo de King's Rook, o KR.
  • Los rangos están numerados desde el punto de vista del jugador en movimiento. Lo que sería el cuarto rango en Algebraico, es el cuarto rango para las blancas, pero el quinto rango para las negras.
  • De ello se deduce que el cuadrado e4es K4para el jugador blanco y K5para el jugador negro. El cuadrado f7es KB7para el jugador blanco y KB2para el jugador negro.
  • Un movimiento es anotado por la pieza en movimiento, luego un guión, luego el cuadrado objetivo. Entonces un peón que se muda a K4es P-K4. Una reina que se muda a KR5es Q-KR5.
  • Una captura es anotada por la pieza de captura, luego x, la pieza capturada. Por lo tanto, un obispo capturando un peón es BxP. Por lo general, debe marcar qué Peón se está capturando, pero ignore esto por simplicidad.
  • Los símbolos de las piezas son Kpara el Rey, Qpara la Reina, Bpara el Obispo, Ktpara el Caballero (tenga en cuenta el símbolo diferente), Rpara la Torre y Ppara el Peón.
  • Otras anotaciones incluyen chpara cheque y matepara jaque mate. Un peón moviéndose KB7y dando cheque es P-KB7 ch. Tenga en cuenta el espacio.

Entrada

Se mueve una cadena de notación algebraica, delineada por espacios. No hay números de movimiento. Por ejemplo, el compañero del tonto dice así:

f3 e5 g4 Qh4#

O el juego Teed vs Delmar, de la misma página de Wikipedia:

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

El juego inmortal .

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#

Puede suponer que la entrada siempre es un juego válido. Todos los movimientos están en el orden correcto y no hay datos extraños presentes. Ningún movimiento incluirá desambiguación .

Por ejemplo, el juego de hoja perenne a pesar de ser, obviamente, un juego válido, no va a ser de entrada debido a la jugada 19, Rad1.

También puede suponer que todas las listas de movimientos de entrada comienzan desde la posición inicial.

Salida

Una lista de movimientos, con un formato similar, en notación descriptiva.

Por ejemplo, el compañero del tonto:

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

Teed vs Delmar:

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

El juego inmortal:

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

Esta no es la notación descriptiva más simple posible, ya que a veces no es necesario especificar a qué archivo Knight se movió (ya que en, Q-KKt4podría escribirse Q-Kt4ya que el movimiento Q-QKt4es imposible). El movimiento BxPes ambiguo (qué peón: debería ser BxQKtP) , pero al Sr. Short no le importa demasiado eso.

Puede considerar estos sus casos de prueba.

Nota: escribí esto a mano. Si detecta algún error evidente, hágamelo saber.

Reglas y puntuación

  • Se aplican reglas estándar: programa con salida a stdout o función. Nada que stderr. Las lagunas estándar están prohibidas.
  • Enlace a un sitio donde podamos probar su código.
  • Código de golf: el código más corto gana.

En conclusión

Este es mi primer desafío, así que probablemente cometí algunos errores novatos. Se agradece la retroalimentación sobre la pregunta (en los comentarios, obviamente).

asibahi
fuente
3
Si realmente desea tiempo para resolver los problemas de su desafío y obtener comentarios al mismo tiempo sin ningún otro problema, puede publicarlo como una propuesta en el sandbox .
R. Kap
Gran primer desafío
edc65
Pensé que la notación descriptiva sería e2-e4 y Ng1-f3 (para e4 y Nf3 respectivamente desde la posición inicial)
ericw31415

Respuestas:

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%

ses la cadena de salida. mes el movimiento actual (los movimientos se toman como parámetros de la línea de comandos). ces la cho la matebandera. pEs la pieza actual. Si no hay una pieza (es decir, una letra minúscula a-h), Pse sustituye. (El Nque Ktla sustitución se hace tarde para salvar bytes.) La columna de destino se veía entonces en un diccionario. Sin embargo, si el movimiento es en realidad una captura, el destino se convierte en xseguido por la pieza previamente en esa casilla. De cualquier manera, el cuadrado de destino se establece en la pieza que se acaba de mover allí. Los movimientos se acumulan hasta que no hay más parámetros y luego se imprimen.

Las variables a1... h8se utilizan para almacenar la última pieza vista. El .prefijo está ahí por la forma en que inicializo la fila de atrás; Es difícil recorrer dos variables a la vez en Batch a menos que se me permita comenzar una con a ..

Neil
fuente