¿A dónde puede ir el cañón?

9

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 Cpuede 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 ( Co 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 , por lo que gana la respuesta más corta (en bytes). ¡Feliz golf!

Cobre
fuente
3
+1 para Xiangqi. Es un juego increíble, que tuve la oportunidad de aprender de mis colegas cuando trabajaba para una empresa china. La sensación general es como jugar al ajedrez (mantener un ojo agudo para la defensa, pero jugar de forma agresiva), pero las tácticas son diferentes (es bueno para traer los carros antes de tiempo, mientras que es malo para traer las torres antes de tiempo en el ajedrez.) En.wikipedia .org / wiki / Xiangqi
Level River St
@LevelRiverSt es mucho menos técnico que el ajedrez y se siente como un videojuego con una sensación estratégica diferente. ¡Me gusta!
noɥʇʎԀʎzɐɹƆ
Parece que no puede haber rey, pero ¿puede haber una pieza más que posible?
l4m2

Respuestas:

1

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 -sbandera.

g@>:2P(f:{Ya@bQ'C?X^z;X^AZa@b:'@aR`\.*@\.*`{aR'.s}Ry.`\.*\w *@`s._@>1R`@ *\w\.*`.y_@<v.s@*s}g@ba).ba.(f;J(Zga)b)

Pruébalo en línea!

Explicación de la versión ungolfed

g@>:2
f:{
 Y a@bQ'C ? `[a-z]` `[A-Z]`
 a@b:'@
 aR:`\.*@\.*` {aR'.s}
 aR:y.`\.*\w *@` s._@>1
 aR:`@ *\w\.*`.y _@<v.s
 a@*s
}
P (f g@b a).b
a.(f; J(Zg)@a b)

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 a através de e. Nuestros dos primeros argumentos, ay b, son las coordenadas del cañón; gcontiene las coordenadas seguidas de las filas del tablero. Para obtener solo el tablero g, lo dividimos del índice 2 en adelante y lo asignamos nuevamente a g( 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 como ay b. 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@bes Co c. 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 en Ycontacto la expresión regular apropiada en la yvariable.

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 introdujo yanteriormente) seguido de \.*\w *@(cualquier número de períodos, una letra, cualquier número de espacios, y @). Esto coincidirá con una cadena como h..R @(siempre que el cañón fuera C). La función de devolución de llamada s._@>1corta 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 fa la fila del cañón y nuevamente a la columna del cañón. La cadena de la fila es g@b, con el índice del cañón dentro de la cadena a. La función devuelve una lista de números de columna, a cada uno de los cuales agregamos el número de fila b. Cuando se imprime la lista, la -sbandera coloca un espacio entre los pares de coordenadas.

Para obtener la columna, utilizamos el Zoperador ip para transponer g, seleccionar índice ay Jformar la lista de caracteres resultante en una cadena. El índice del cañón dentro de esta cadena es b. La función devuelve una lista de números de fila, a cada uno de los cuales anteponemos el número de columna a. 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 el Janálisis como operador unario en lugar de binario).

DLosc
fuente