Le roi peut-il attraper le pion?

26

Étant donné une entrée de quatre entiers x 1 , y 1 , x 2 et y 2 , indiquez si un roi blanc aux échecs (avec les coordonnées ( x 1 , y 1 )) pourrait attraper un pion noir (avec les coordonnées ( x 2 , y 2 )) et capturez-le si le pion se déplace pour devenir une reine le plus rapidement possible.

Les coordonnées du conseil sont les suivantes:

       first coordinate (x)
             12345678

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

Supposons qu'il soit blanc pour se déplacer (le tour du roi) et que les deux joueurs jouent de manière optimale (le roi se déplacera aussi vite que possible pour attraper le pion, et le pion se déplacera aussi vite que possible pour se promouvoir). Les coordonnées d'entrée seront toujours distinctes et le pion ne commencera jamais par une coordonnée y de 8.

Le roi se déplace d'un carré dans n'importe quelle direction à chaque tour (il peut se déplacer en diagonale), et le pion ne peut avancer que d'un espace vers l'avant (diminuer sa coordonnée y), à moins qu'il ne soit à sa position initiale (avec notre système de coordonnées, coordonnée y de 7), auquel cas il peut avancer de deux espaces.

L'entrée peut être donnée sous la forme d'une chaîne séparée par des espaces / virgules, un tableau de chaînes / entiers ou quatre arguments de fonction / ligne de commande / etc. Les coordonnées peuvent être données dans l'ordre qui convient le mieux / golfy (donc, accepter l'entrée comme [y 2 , y 1 , x 1 , y 2 ] est acceptable tant qu'elle est cohérente). La sortie doit être une valeur véridique ou fausse .

Puisqu'il s'agit de , le code le plus court en octets l'emporte.

Cas de test véridiques :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Cas de test de falsification :

6 4 3 2

8 8 1 7

3 4 3 2

Poignée de porte
la source
Pouvons-nous choisir l'ordre des coordonnées ou doit-il être x1 y1 x2 y2?
Dennis
11
Je suggère le cas de test 1 8 1 7, où le roi capture avant que le pion ne puisse déplacer deux espaces. Je pense que toutes les réponses se trompent maintenant. Cette situation rend le problème beaucoup plus difficile.
xnor
1
@Neil parce que la conversion en nombres est juste ennuyeuse et n'ajoute rien
edc65
1
@Neil Il y a déjà beaucoup de messages ici concernant la notation algébrique, et je voulais me concentrer sur le défi réel.
Poignée de porte
2
@kaine Le pion ne constitue pas une menace importante pour le roi à moins que le roi ne puisse pas l'accepter ou avant le coup qu'il promeut. Le roi n'a pas besoin de se mettre en échec car il peut toujours faire un bon coup.
Neil

Réponses:

3

Gelée , 33 octets

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

Ce programme lit les coordonnées à x2\nx1\ny2\ny1partir de STDIN. Essayez-le en ligne!

Version non concurrente

Malheureusement, l'interprète Jelly a eu un bug lorsque cette question a été publiée. Ce bug l'a empêché d'accepter plus de deux arguments de ligne de commande. La dernière version de Jelly peut résoudre la tâche donnée en 23 octets .

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

Essayez-le en ligne!

Dennis
la source
18

Python 2, 53 40

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

Le roi a les coordonnées (x, y)et le pion (p, q).

Il y a trois cas importants:

  1. Le pion est au rang 7 et le roi au rang 8. Pour capturer le pion, le roi doit être sur le même fichier ou un fichier adjacent.

    Résultat: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. Le pion est au rang 7. Pour capturer le pion, le roi doit se trouver dans six fichiers.

    Résultat: q = 7 → |x - p| ≤ 6

  3. Le pion est de rang inférieur. Pour capturer le pion, le roi doit pouvoir atteindre la case de promotion au plus un coup après le pion.

    Résultat: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

Ma solution, ce sont ces conditions qui ont été gâtées. Espérons qu'il n'y ait pas d'erreurs cette fois.

grc
la source
2
Que diriez-vous de couper absavec max(y-1,x-p,p-x)?
xnor
Cela ne devrait pas f(1,8,1,7)être Trueparce que le roi capture immédiatement le pion? Je pense qu'il y a une subtilité où le pion rangée 7 ne peut pas être traité comme rangée 6 si le roi capture immédiatement.
xnor
@xnor Je pense que c'est corrigé maintenant (d'une manière mal golfée).
grc
1
Si vous avez inversé la dernière condition, vous pouvez supprimer l'espace entre le oret -2.
xsot
@xsot merci pour l'astuce. J'ai changé d'approche et je l'ai un peu plus expliquée maintenant.
grc
2

Prolog, 48 42 octets

Code:

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

Exemples:

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

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

Pas un mauvais défi pour Prolog par rapport à la plupart.

Edit: sauvé 6 octets en passant à la formule utilisée dans la réponse Python 2 de grc .
Malheureusement, Prolog ne peut pas enchaîner les comparaisons comme le fait Python et la division entière est 1 octet de plus que la division float.

Essayez-le en ligne ici

Emigna
la source
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)

J'espère avoir sauvé des octets sans utiliser Math.abs, Math.min, Math.max

Le pion au septième rang peut s'échapper de 2 cases en mouvement, si et seulement si le roi n'est pas dans une colonne proche - c'est pourquoi il y a un contrôle davant de remplacer 7 par 6.

Cas de test à exécuter dans la console:

;[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)]

Résultat: [true, true, true, true, false, false, false]

edc65
la source
0

Rubis, 50 octets

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

Les arguments sont (roi x, roi y, pion x, pion y), tous des entiers.

PellMell
la source