Damas Damas

10

El objetivo de este desafío es determinar si un movimiento es un movimiento legal de English Checkers .

Este desafío utilizará una placa de 8x8. Una pieza movida debe tratarse como un hombre (no un rey) que solo puede moverse diagonalmente hacia adelante. El tablero tendrá 0 o más piezas negras y 1 o más piezas blancas. Una pieza blanca se moverá actualmente. La pieza blanca puede "saltar" sobre una pieza negra en diagonal frente a ella si el cuadrado directamente detrás está vacío. Es posible dar un salto adicional desde esa posición si hay otra pieza negra en cualquier dirección diagonalmente frente a ella. La captura es obligatoria, por lo que es ilegal no dar un salto que esté disponible. Sin embargo, no es obligatorio tomar un camino que maximice el número de saltos. Básicamente, esto significa que si haces un salto y hay otro salto posible desde la posición final, entonces ese movimiento es ilegal. Las posiciones de las piezas utilizan el siguiente esquema de numeración:

Numeración de tablero de ajedrez


Reglas

Entradas:

  • Una lista de números que representan piezas negras.

  • Una lista de números que representan piezas blancas.

  • Una posición inicial para la pieza blanca.

  • La posición final de la pieza blanca.

Salida:

  • Un valor verdadero si el movimiento es válido, de lo contrario, un valor falso


Puede suponer que una pieza blanca siempre ocupará la posición inicial.

Si es conveniente, puede suponer que la primera pieza blanca en la lista de piezas blancas contendrá la posición inicial en lugar de aceptar la entrada 3.

Código estándar de reglas de golf. Pocos bytes ganan.


Casos de prueba

Para ilustrar, O es la posición inicial, X es la posición final, B son piezas negras y W son piezas blancas

Black pieces: []
White pieces: [5]
Move: (5, 1)
Output: True

Single move no jump
 X _ _ _
O _ _ _ 

B: [6]
W: [9]
M: (9, 2)
O: True

Single jump
 _ X _ _
_ B _ _ 
 O _ _ _

B: [2, 6]
M: (9, 2)
O: False

Illegal ending position on top of black piece
 _ X _ _
_ B _ _ 
 O _ _ _

B: [7, 14]
W: [17]
M: (17, 3)
O: True

Double jump
 _ _ X _
_ _ B _ 
 _ _ _ _
_ B _ _ 
 O _ _ _

B: [7, 14]
M: (17, 10)
O: False

Illegal jump, must take the next jump as well
 _ _ _ _
_ _ B _ 
 _ X _ _
_ B _ _ 
 O _ _ _

B: [4]
W: [8]
M: (8, 3)
O: False

Illegal jump across the board
 _ _ _ X
B _ _ _ 
 O _ _ _


B: [6, 7]
W: [6]
M: (10, 1)
O: True

Split decision p1
 X _ _ _
_ B B _ 
 _ O _ _

B: [6, 7]
M: (10, 3)
O: True

Split decision p2
 _ _ X _
_ B B _ 
 _ O _ _


B: [2]
W: [1]
M: (1, 3)
O: False

Sideways Jump
 O B X _

B: [6]
W: [1]
M: (1, 10)
O: False

Backwards Jump
 O _ _ _
_ B _ _ 
 _ X _ _

B: [6]
W: [9, 2]
M: (9, 2)
O: False

Illegal ending position on top of white piece
 _ X _ _
_ B _ _ 
 O _ _ _

B: []
W: [9, 6]
M: (9, 2)
O: False

Illegal jump over white piece
 _ X _ _
_ W _ _ 
 O _ _ _

B: [8, 15, 23, 24]
W: [27]
M: (27, 4)
O: True


Split decision long path
 _ _ _ X
_ _ _ B 
 _ _ _ _
_ _ B _ 
 _ _ _ _
_ _ B B 
 _ _ W _

B: [8, 15, 23, 24]
W: [27]
M: (27, 20)
O: True

Split decision short path
 _ _ _ _
_ _ _ B 
 _ _ _ _
_ _ B _ 
 _ _ _ X
_ _ B B 
 _ _ W _
aoemica
fuente
3
Sugiero un caso de prueba como B=[8,15,23,24];W=[27]con cada uno M=[27,4]y M=[27,20]1. dará un cambio de dirección. 2 responderá una pregunta que tengo: ¿son válidos o deben tomarse más tiempo? ("La captura es obligatoria, por lo que es ilegal no dar un salto que esté disponible" sugiere que ambos son válidos, aunque no sé por qué es ilegal no capturar si es posible, por lo que tal vez quieras tomar como ¿Cuántas piezas como sea posible?)
Jonathan Allan
Lo siento, no sé cómo jugar damas (en inglés) . ¿Le importaría agregar más detalles sobre lo que es un movimiento legal?
tsh
1
Aquí hay un resumen de los casos de prueba en formato compatible con STDIN.
Arnauld
La captura es obligatoria, por lo que es ilegal no dar un salto que esté disponible. ¿Qué significa "dar un salto"?
Erik the Outgolfer
1
@ JonathanAllan Creo que abordé tu pregunta en la explicación y agregué los casos de prueba.
aoemica

Respuestas:

1

Eso fue desafiante :) * errores corregidos (bytes agregados)

JavaScript (Node.js) , 197 193 191 185 181 186 bytes

f=(B,W,S,E,F=1)=>g(S).filter((x,i)=>B[I="includes"](x)&!B[I](t=g(x)[i])&!W[I](t)&&t>0?F+=f(B,W,t,E):0)[0]?F>1:g(S)[I](E)
g=S=>[S--,!(y=~-(e=S-3)/4%2|0)||S%4^3?y?e+1:e:0,S%4||y?y?e:e-1:0]

Pruébalo en línea!

DanielIndie
fuente
Creo que puedes usar en >>2&1lugar de /4%2|0.
Arnauld
Caso de prueba: [10, 3], [14], 14, 7fallido.
tsh
@tsh corregido :), si fallaron más casos de prueba, avíseme
DanielIndie