Introducción
El juego de xiangqi , también conocido como ajedrez chino, es un juego similar al ajedrez popular en China, Vietnam, Taiwán y otros países del este asiático. Los colores de los dos lados en xiangqi son rojo y negro. Hay siete piezas en xiangqi: general ( G
), asesor ( A
), elefante ( E
), caballo ( H
), carro ( R
), cañón ( C
) y soldado ( S
). Para los propósitos de este desafío, las piezas en mayúscula se consideran rojas y las minúsculas en negro. La mayoría de estas piezas tienen un equivalente aproximado en el ajedrez occidental, pero hay una pieza completamente única: el cañón.
El cañón se mueve como una torre en el ajedrez o un carro en xiangqi (moviendo cualquier número de espacios en los ejes X o Y), pero no puede atacar de esta manera. En cambio, ataca saltando a lo largo de los ejes X o Y (de la misma manera que se mueve) sobre una pieza de cualquier color (amigo o enemigo) y aterrizando en la pieza del color opuesto, que luego captura. Tenga en cuenta que, como todas las piezas de ajedrez y xiangqi, los cañones no pueden capturar piezas de su propio color.
Por ejemplo, en el siguiente diagrama, los espacios a los que C
puede moverse el cañón ( ) están marcados *
y aquellos a los que puede saltar y capturar están marcados X
, suponiendo que haya una pieza negra / minúscula allí.
....X....
.........
.........
....h....
....*....
****C**aX
....E....
....X....
....g....
....R....
Desafío
Escriba un programa o función que, dada una placa xiangqi y las coordenadas de un cañón en esa placa como entrada, emite una lista de coordenadas a las que el cañón puede moverse o saltar.
El formato para todas las E / S es flexible.
Los formatos aceptables para el tablero xiangqi incluyen una cadena separada por una nueva línea, una lista de cadenas o una cadena con cualquier otro separador no incluido aceghrsACEGHRS.
. Puede suponer que el tablero siempre será 9x10, el tamaño de un tablero xiangqi.
El contenido del tablero en sí consistirá en varios puntos ( .
), que representan puntos vacíos en el tablero y personajes que representan piezas. La asignación de pieza a personaje es la siguiente:
A -> advisor
C -> cannon
E -> elephant
G -> general
H -> horse
R -> chariot
S -> soldier
Las letras mayúsculas representan piezas rojas, y las letras minúsculas representan piezas negras. Los caracteres que no figuran aquí (es decir, que no están en aceghrsACEGHRS.
) no aparecerán en el tablero.
El formato de la coordenada de entrada es flexible y no es necesario que coincida con el formato de las coordenadas de salida. Puede ser una lista de dos elementos enteros, una tupla de 2, dos números con cualquier separador o dos caracteres, por ejemplo. También puede ser 0 indexado o 1 indexado. Puede suponer que la coordenada en el tablero siempre se resolverá en un cañón ( C
o c
).
Las coordenadas a las que el cañón puede saltar y moverse deben aparecer en la misma lista en la salida; La distinción entre los dos no es necesaria. Los formatos aceptables para cualquier coordenada de salida individual son los mismos que para las coordenadas de entrada. Las coordenadas pueden estar separadas por una nueva línea, enviadas como una lista o cualquier otra representación. No es necesario ningún orden en particular; el orden ni siquiera tiene que ser determinista.
Tenga en cuenta que los saltos sobre una pieza del mismo color (caja) del cañón no son legales y, por lo tanto, no pueden aparecer en la salida.
Casos de prueba
Tenga en cuenta que no todos los casos de prueba son posibles posiciones xiangqi.
Input board
Input coordinate (0-indexed)
List of output coordinates
.........
.........
.........
.........
.........
....C....
.........
.........
.........
.........
(4, 5)
[(0, 5), (1, 5), (2, 5), (3, 5), (5, 5), (6, 5), (7, 5), (8, 5), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 6), (4, 7), (4, 8), (4, 9)]
.........
.....G...
.........
.........
.....e...
.........
.........
h..R.c..S
.....a...
.........
(5, 7)
[(4, 7), (6, 7), (7, 7), (5, 6), (5, 5), (5, 1)]
..s......
..A...e..
.........
EACCcsh.H
..r......
.....S...
......s..
....C....
..g......
(2, 3)
[(2, 0), (2, 2), (4, 3), (2, 9)]
rheagaehr
.........
.c.....c.
s.s.s.s.s
.........
.........
S.S.S.S.S
.C.....C.
.........
RHEAGAEHR
(7, 7)
[(2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (8, 7), (7, 0), (7, 3), (7, 4), (7, 5), (7, 6), (7, 8)]
Puntuación
Este es el código de golf , por lo que gana la respuesta más corta (en bytes). ¡Feliz golf!
fuente
Respuestas:
Pip , 112 + 1 = 113 bytes
Toma la entrada como argumentos de línea de comando: las dos coordenadas, seguidas de las 10 líneas del tablero. Las coordenadas están basadas en 0. Produce coordenadas como
67 77
, con una nueva línea entre la lista de la misma fila y la lista de la misma columna. Un byte agregado para la-s
bandera.Pruébalo en línea!
Explicación de la versión ungolfed
Por defecto, Pip lee los argumentos de la línea de comandos en la lista
g
. También almacena los primeros cinco argumentos en las variables aa
través dee
. Nuestros dos primeros argumentos,a
yb
, son las coordenadas del cañón;g
contiene las coordenadas seguidas de las filas del tablero. Para obtener solo el tablerog
, lo dividimos del índice 2 en adelante y lo asignamos nuevamente ag
(g@>:2
).Ahora definimos una función
f
. Esta función toma dos argumentos: una cadena que representa una fila o columna del tablero, y el índice del cañón en esa cadena. Estos argumentos están disponibles dentro de la función comoa
yb
. La función devolverá una lista de todos los índices que representan puntos a los que el cañón puede moverse o capturar.Primero, probamos si
a@b
esC
oc
. Si es asíC
, vamos a querer que la expresión regular[a-z]
coincida con las piezas que puede capturar. Si es asíc
, la expresión regular es[A-Z]
. (El código de golf genera estas expresiones regulares a partir de las variables integradas para el alfabeto en mayúsculas y minúsculas). Ponemos enY
contacto la expresión regular apropiada en lay
variable.Cambiamos el carácter del cañón en la cadena a
@
(para distinguirlo de otros cañones en la misma fila / columna).Luego viene una serie de reemplazos de expresiones regulares, que cambiarán cada lugar donde el cañón puede ir a un personaje espacial. Las primeras
\.*@\.*
coincidencias de expresiones regulares@
rodeadas por cualquier número de períodos, todos los cuales representan lugares vacíos a los que se puede mover el cañón. El reemplazo utiliza una función de devolución de llamada{aR'.s}
para cambiar todos los períodos a espacios.La siguiente expresión regular coincide con una pieza que el cañón puede capturar: ya sea
[a-z]
o[A-Z]
(dependiendo de cuál se introdujoy
anteriormente) seguido de\.*\w *@
(cualquier número de períodos, una letra, cualquier número de espacios, y@
). Esto coincidirá con una cadena comoh..R @
(siempre que el cañón fueraC
). La función de devolución de llamadas._@>1
corta el primer carácter y antepone un espacio.La tercera expresión regular es similar, pero coincide con una pieza capturable después del cañón en lugar de antes.
Finalmente, la función regresa
a@*s
, usando el operador find-all para obtener una lista de los índices de todos los espacios.Ahora llamamos
f
a la fila del cañón y nuevamente a la columna del cañón. La cadena de la fila esg@b
, con el índice del cañón dentro de la cadenaa
. La función devuelve una lista de números de columna, a cada uno de los cuales agregamos el número de filab
. Cuando se imprime la lista, la-s
bandera coloca un espacio entre los pares de coordenadas.Para obtener la columna, utilizamos el
Z
operador ip para transponerg
, seleccionar índicea
yJ
formar la lista de caracteres resultante en una cadena. El índice del cañón dentro de esta cadena esb
. La función devuelve una lista de números de fila, a cada uno de los cuales anteponemos el número de columnaa
. Esta lista, siendo la última expresión en el programa, se imprime automáticamente.(En caso de que alguien se lo preguntara, el separador de expresiones
;
está ahí para forzar elJ
análisis como operador unario en lugar de binario).fuente