Damas: rey yo?


14

Desafío:

Dado un tablero de ajedrez, genera la menor cantidad de movimientos que tomaría (suponiendo que el negro no se mueva en absoluto) para reinar una pieza roja, si es posible.

reglas :

El lado rojo siempre estará en la parte inferior, sin embargo, sus piezas pueden comenzar en cualquier fila (incluso la fila del rey a la que deben llegar). Las piezas negras son estacionarias , lo que significa que no se mueven entre los movimientos del rojo, pero se retiran del tablero cuando se capturan. Tenga en cuenta que las piezas pueden comenzar en cualquier espacio del tablero, incluso uno al lado del otro. No es así como se juegan las fichas normales, pero su programa debe ser capaz de resolverlas. (Ver entrada 5) Sin embargo, las piezas de verificación solo deben moverse en diagonal (ver entrada 3). Se permite la captura hacia atrás si la primera captura es hacia adelante en la cadena (ver entrada 7).

Entrada:

Un tablero de ajedrez de 8x8, con espacios de tablero definidos como los siguientes caracteres (siéntase libre de usar alternativas siempre que sean consistentes):

. - Vacío

R - Pieza (s) roja (s)

B - Pieza (s) negra (s)

Salida:

El número más pequeño de movimientos que tomaría una pieza roja para ser 'kinged' al ingresar a la fila del rey en la fila superior del tablero (lado negro), 0 si no se requieren movimientos (una pieza roja comenzó en la fila del rey), o un número negativo si es imposible reinar una pieza roja (es decir, el negro ocupa toda su primera fila).

Entrada 1:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Salida 1:

7

Entrada 2:

. . . . . . . .
. . . . . . . .
. . . . . B . .
. . . . . . . .
. . . B . . . .
. . . . . . . .
. B . . . . . .
R . . . . . . .

Salida 2:

2

Entrada 3:

. B . B . B . B
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Salida 3:

-1

Entrada 4:

. . . . . . . R
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
R . . . . . . .

Salida 4:

0

Entrada 5:

. . . . . . . .
. . . . . . . .
. . . . . . . .
. B . . B . . .
B . . . . B . .
. B . B . . . .
. . B . . B . .
. . . R R . . .

Salida 5:

4

Entrada 6:

. . . . . . . .
. . . . . . . .
. B . . . . . .
. . B . . . . .
. B . B . . . .
. . . . R . . .
. . . B . . . .
. . . . R . . .

Salida 6:

2

Entrada 7:

. . . . . . . .
. . . . . . . .
. . B . . . . .
. . . . . . . .
. . B . . . . .
. B . B . B . .
. . . . B . . .
. . . . . R . R

Salida 7:

4

Puntuación:

Este es el , por lo que gana el código más corto en bytes.


1
¿No debería ser el segundo caso de prueba 2, ya que puedes hacer doble / triple salto?
DJMcMayhem

¿Es correcta una matriz de estado de matrices de enteros como entrada?
Jonathan Allan

1
Agregué otro caso de prueba que debería resultar difícil. Implica múltiples saltos, múltiples piezas y saltos hacia atrás para lograr la mejor solución posible.
orlp

1
@orlp Hm, iba a decir que ninguna de las piezas rojas puede moverse hacia atrás ya que ninguna de ellas son reyes (de ahí el punto del desafío), pero parece que algunas personas juegan con reglas donde la captura hacia atrás está permitida por piezas con punta si la primera captura fue hacia adelante. Agregaré eso a las reglas ya que no estaba al tanto de esto antes.
Yodle

1
ooooooooh, no tienes que elegir solo una pieza roja, ¡pueden formar un equipo! Lo entiendo
Greg Martin

Respuestas:


4

JavaScript (ES6), 354322 bytes

Toma una matriz como entrada con:

  • 0 = cuadrado vacío
  • 1 = pieza roja
  • 2 = pieza negra

Devuelve el número óptimo de movimientos, o 99 si no hay solución.

Es muy rápido pero se puede jugar mucho más al golf.

F=(b,n=0,C=-1,i)=>b.map((v,f,X,T,x=f&7,y=f>>3)=>v-1||(y&&n<m?[-9,-7,7,9].map(d=>(N=c=X=-1,r=(d&7)<2,T=(t=f+d)>=0&t<64&&(x||r)&&(x<7||!r)?(!b[t]&d<0)?t:b[t]&1?N:b[t]&2&&(d<0&y>1|d>0&C==f)?(X=t,x>1||r)&&(x<6|!r)&&!b[t+=d]?c=t:N:N:N)+1&&(b[f]=b[X]=0,b[T]=1,F(b,n+!(C==f&c>N),c,1),b[f]=1,b[X]=2,b[T]=0)):m=n<m?n:m),m=i?m:99)|m

var test = [
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,2,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,2,0,2,0,2,0,2,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,1,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    1,0,0,0,0,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,2,0,0,0,
    2,0,0,0,0,2,0,0,
    0,2,0,2,0,0,0,0,
    0,0,2,0,0,2,0,0,
    0,0,0,1,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,2,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0,
    0,0,0,2,0,0,0,0,
    0,0,0,0,1,0,0,0
  ],
  [ 0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,0,2,0,0,0,0,0,
    0,2,0,2,0,2,0,0,
    0,0,0,0,2,0,0,0,
    0,0,0,0,0,1,0,1
  ]
];

test.forEach((b, n) => {
  console.log("Test #" + (n + 1) + " : " + F(b));
});


99 probablemente esté bien, no puedo imaginar una solución real que tome 99 movimientos en un tablero de 8x8. ¡Buen trabajo!
Yodle
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.