Dadas dos posiciones diferentes en un tablero de ajedrez y el tipo de pieza, genera la cantidad mínima de movimientos que tomará para que esa pieza vaya de una posición a otra.
Reglas
La pieza dada puede ser Rey, Reina, Torre, Caballero y Obispo. (Esta entrada se puede tomar como 5 caracteres únicos)
Las 2 posiciones se pueden tomar en cualquier formato conveniente,
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
En caso de que la pieza no pueda llegar allí, arroje algo que no sea un entero positivo.
Ejemplos
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Respuestas:
JavaScript (Node.js) ,
183180179 bytesPruébalo en línea!
Adiós al caso límite, gracias a Arnauld por verificar. Prueba de caballero
fuente
max
con un ternario.APL (Dyalog Classic) ,
117107105103989795928987 bytesPruébalo en línea!
el argumento izquierdo es tipo de pieza: 0 = rey, 1 = reina, 2 = torre, 3 = caballero, 4 = alfil; La arg derecha es una matriz de coordenadas 2x2, cada fila representa una posición; devuelve 0 para inalcanzable
|-⌿⍵
calcula el par [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
elige una expresión de la lista "..."; si es una función, se aplica a|-⌿⍵
; si es un valor (esto ocurre solo para un caballero),⊣
asegúrese de devolverlo en lugar de|-⌿⍵
king: max (
⌈/
) de los abdominales ∆-sreina: eliminar ceros (
~∘0
) y contar (≢
) único (∪
)torre: suma (
+/
) de signa (monádico×
; 0 para 0, 1 para positivo)caballero:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- comienza con la posición inicial y calcula de forma recursiva generaciones de movimientos de caballero hasta que la posición final esté en el set; profundidad de recursión de retornoobispo: ¿son iguales las paridades de las dos ∆-s? (
2=.|⊢
, equivalente a=/2|⊢
) multiplicar el resultado booleano (0 o 1) por el recuento único (≢∘∪
)fuente
⍎⍺⊃
. Muy inteligente.Java (JDK) , 229 bytes
Pruébalo en línea!
Explicaciones
Código:
Créditos
fuente
Carbón , 108 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Liste todos los 64 cuadrados del tablero en la variable de lista vacía predefinida.
Haga una lista de listas cuya primera entrada es una lista que contiene la posición de inicio.
Repita hasta que la última entrada de la lista contenga la posición final.
Filtre todas las posiciones del tablero que se alejan de un caballero de cualquier entrada en la última entrada de la lista de listas y empuje esa lista a la lista de listas. Esto incluye los puestos visitados anteriormente, pero de todos modos no estábamos interesados en ellos, por lo que terminamos con una primera búsqueda amplia del tablero para el puesto final.
Calcule las diferencias absolutas de coordenadas entre las posiciones inicial y final.
Seleccione en función de la pieza de entrada.
Si es un rey, imprima la diferencia de coordenadas absoluta máxima.
Si es una reina, imprime 2 a menos que las dos diferencias sean iguales o una sea cero.
Si es una torre, imprime 2 a menos que una de las diferencias sea cero.
Si es un alfil, imprima 0 si los cuadrados son de paridad opuesta, de lo contrario imprima 2 a menos que las dos diferencias sean iguales.
Si se trata de un caballero, imprime el número de bucles realizados para encontrar la posición final.
fuente
Japt , 67 bytes
Pruébalo en línea!
Esa fue toda una experiencia. Me inspiré mucho en la excelente respuesta APL . Sospecho que todavía es posible jugar al golf, especialmente en el código Knight.
Las posiciones son la primera entrada, en el formulario
[[x1,x2],[y1,y2]]
. También debería funcionar[[y1,y2],[x1,x2]]
bien. La selección de piezas es la segunda entrada, con 0 = rey, 1 = reina, 2 = caballero, 3 = torre, 4 = alfil. Tenga en cuenta que Knight y Rook se intercambian en comparación con la respuesta APL.Explicación:
fuente
á
funcionaba acortar[[1,2][2,1]]
considerablemente.á
, agradable!U
está implícito después@
, por lo que puede guardar dos bytes en la función de caballero. También puede comenzar con@=ã ü;
para guardar otro. (Elã
truco también es inteligente :-))