¿Puede el rey atrapar el peón?

26

Dada una entrada de cuatro enteros x 1 , y 1 , x 2 e y 2 , genera si un rey blanco en el ajedrez (con coordenadas ( x 1 , y 1 )) podría atrapar un peón negro (con coordenadas ( x 2 , y 2 )) y captúralo si el peón se mueve para ascender a una reina lo más rápido posible.

Las coordenadas del tablero son las siguientes:

       first coordinate (x)
             12345678

           1 .#.#.#.#
           2 #.#.#.#.
           3 .#.#.#.#
  second   4 #.#.#.#.
coordinate 5 .#.#.#.#
    (y)    6 #.#.#.#.
           7 .#.#.#.#
           8 #.#.#.#.

Suponga que es blanco para moverse (el turno del rey) y que ambos jugadores juegan de manera óptima (el rey se moverá lo más rápido posible para atrapar el peón, y el peón se moverá lo más rápido posible para ascender). Las coordenadas de entrada siempre serán distintas, y el peón nunca comenzará con una coordenada y de 8.

El rey se mueve una casilla en cualquier dirección cada turno (puede moverse en diagonal), y el peón solo puede moverse un espacio hacia adelante (disminuir su coordenada y), a menos que esté en su posición inicial (con nuestro sistema de coordenadas, coordenada y de 7), en cuyo caso puede mover dos espacios hacia adelante.

La entrada puede darse como una cadena separada por comas / espacios en blanco, una matriz de cadenas / enteros o cuatro argumentos de función / línea de comando / etc. Las coordenadas se pueden dar en el orden que sea más conveniente / golfista (por lo tanto, aceptar la entrada como [y 2 , y 1 , x 1 , y 2 ] está bien siempre que sea coherente). La salida debe ser un valor verdadero o falso .

Como se trata de , gana el código más corto en bytes.

Casos de prueba de verdad :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Casos de prueba de falsa :

6 4 3 2

8 8 1 7

3 4 3 2

Pomo de la puerta
fuente
¿Podemos elegir el orden de las coordenadas o tiene que ser x1 y1 x2 y2?
Dennis
11
Sugiero el caso de prueba 1 8 1 7, donde el rey captura antes de que el peón pueda mover dos espacios. Creo que todas las respuestas ahora se equivocan. Esta situación hace que el problema sea mucho más difícil.
xnor
1
@Neil porque la conversión a números es simplemente aburrida y no agrega nada
edc65
1
@Neil Ya hay muchas publicaciones aquí que incluyen notación algebraica, y quería centrarme en el desafío real.
Pomo de la puerta
2
@kaine El peón no representa una amenaza significativa para el rey a menos que el rey no pueda asumirlo o antes del movimiento que promueve. El rey no tiene que pasar a jaque porque siempre hay un movimiento igualmente bueno que puede hacer.
Neil

Respuestas:

3

Jalea , 33 bytes

‘»Ɠ_2<®
Ɠ©<7
:5+Ɠ>7$¤<1.4
Ɠ_ƓA2£Ŀ

Este programa lee las coordenadas a partir x2\nx1\ny2\ny1de STDIN. Pruébalo en línea!

Versión no competitiva

Desafortunadamente, el intérprete de Jelly tenía un error cuando se publicó esta pregunta. Dicho error le impidió aceptar más de dos argumentos de línea de comandos. La versión más nueva de Jelly puede resolver la tarea dada en 23 bytes .

⁶>7×5
_A+⁵>6$¤+¢’»⁶_2<⁵

Pruébalo en línea!

Dennis
fuente
18

Pitón 2, 53 40

lambda x,y,p,q:y-2<q>=abs(x-p)+q/7+y/8*5

El rey tiene coordenadas (x, y)y el peón (p, q).

Hay tres casos importantes:

  1. El peón está en el rango 7 y el rey en el rango 8. Para capturar el peón, el rey debe estar en el mismo archivo o en uno adyacente.

    Resultado: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. El peón está en el rango 7. Para capturar el peón, el rey debe estar dentro de seis archivos.

    Resultado: q = 7 → |x - p| ≤ 6

  3. El peón está en un rango inferior. Para capturar el peón, el rey debe poder alcanzar la casilla de promoción como máximo un movimiento después del peón.

    Resultado: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

Mi solución es solo estas condiciones de golf. Esperemos que no haya errores esta vez.

grc
fuente
2
¿Qué tal cortar el abscon max(y-1,x-p,p-x)?
xnor
¿No debería f(1,8,1,7)ser Trueporque el rey captura inmediatamente el peón? Creo que hay una sutileza en la que la fila de peones 7 no puede tratarse como la fila 6 si el rey captura de inmediato.
xnor
@xnor Creo que está arreglado ahora (de una manera muy mal golfizada).
grc
1
Si invirtió la última condición, puede eliminar el espacio entre ory -2.
xsot
@xsot gracias por el consejo. Cambié mi enfoque y lo puse un poco más ahora.
grc
2

Prolog, 48 42 bytes

Código:

p(X,Y,P,Q):-Y-2<Q,Q>=abs(X-P)+Q//7+Y//8*5.

Ejemplos:

p(1,8,1,7).
true

p(3,4,3,2).
false

No es un mal desafío para Prolog en comparación con la mayoría.

Editar: guardado 6 bytes al cambiar a la fórmula utilizada en la respuesta Python 2 de grc .
Desafortunadamente, Prolog no puede encadenar las comparaciones como la pitón puede y la división entera es 1 byte más larga que la división flotante.

Pruébalo en línea aquí

Emigna
fuente
0

JavaScript (ES6), 52

(x,y,u,t,d=x>u?x-u:u-x)=>(d>=y?d:y-1)<=(d<2|t<7?t:6)

Espero haber guardado bytes sin usar Math.abs, Math.min, Math.max

El peón en la fila siete puede escapar moviendo 2 espacios, si y solo si el rey no está en una columna cercana, es por eso que hay un control sobre d antes de sustituir 7 por 6.

Caso de prueba para ejecutar en la consola:

;[f(5,3,3,2),f(6,1,1,7),f(3,3,3,2),f(1,8,1,7),f(6,4,3,2),f(8,8,1,7),f(3,4,3,2)]

Resultado: [true, true, true, true, false, false, false]

edc65
fuente
0

Ruby, 50 bytes.

def f(a,b,c,d)(a-c).abs<=(d==7?6-b/8*5:d)&&b-d<2;end

Los argumentos son (rey x, rey y, peón x, peón y), todos los enteros.

Caótico
fuente