Может ли король поймать пешку?

26

При вводе четырех целых чисел x 1 , y 1 , x 2 и y 2 выведите, может ли белый король в шахматах (с координатами ( x 1 , y 1 )) поймать черную пешку (с координатами ( x 2 , y) 2 )) и поймайте его, если пешка движется, чтобы продвинуться до ферзя как можно быстрее.

Координаты доски следующие:

       first coordinate (x)
             12345678

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

Предположим, что ход белых (ход короля), и что оба игрока играют оптимально (король будет двигаться как можно быстрее, чтобы поймать пешку, а пешка будет двигаться как можно быстрее для продвижения). Входные координаты всегда будут различны, и пешка никогда не начнется с y-координаты 8.

Король передвигается на одну клетку в любом направлении каждый ход (он может двигаться по диагонали), а пешка может двигаться только на одну клетку вперед (уменьшая свою координату y), если только она не находится в своей начальной позиции (с нашей системой координат, координатой y 7), в этом случае он может двигаться вперед на два пробела.

Входные данные могут быть заданы в виде строки, разделенной пробелами / запятыми, массива строк / целых чисел или четырех аргументов функции / командной строки / и т. Д. Координаты могут быть заданы в любом удобном порядке / для гольфа (поэтому принимать входные данные как [y 2 , y 1 , x 1 , y 2 ] можно только при условии их согласованности). Вывод должен быть истинным или ложным значением .

Поскольку это , выигрывает самый короткий код в байтах.

Правдивые тестовые случаи :

5 3 3 2

6 1 1 7

3 3 3 2

4 1 4 7

7 7 1 7

1 8 1 7

Ложные тесты :

6 4 3 2

8 8 1 7

3 4 3 2

Дверная ручка
источник
Можем ли мы выбрать порядок координат или это должно быть x1 y1 x2 y2?
Деннис
11
Я предлагаю контрольный пример 1 8 1 7, в котором король захватывает, прежде чем пешка может переместиться на два пробела. Я думаю, что все ответы теперь не так. Эта ситуация делает проблему намного сложнее.
xnor
1
@Neil, потому что преобразование в числа просто скучно и ничего не добавляет
edc65
1
@Neil Здесь уже есть много постов с алгебраической нотацией, и я хотел сосредоточиться на реальной задаче.
Дверная ручка
2
@kaine Пешка не представляет существенной угрозы для короля, если только король не может взять ее на себя или перед ходом, который он продвигает. Королю не нужно проходить проверку, потому что всегда есть такой же хороший ход, который он может сделать.
Нил

Ответы:

3

Желе , 33 байта

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

Эта программа читает координаты как x2\nx1\ny2\ny1из STDIN. Попробуйте онлайн!

Неконкурентная версия

К сожалению, у переводчика Jelly была ошибка, когда этот вопрос был опубликован. Указанная ошибка не позволила ему принять более двух аргументов командной строки. Новейшая версия Jelly может решить данную задачу за 23 байта .

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

Попробуйте онлайн!

Деннис
источник
18

Python 2, 53 40

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

У короля есть координаты (x, y)и пешка (p, q).

Есть три значимых случая:

  1. Пешка находится на 7-м уровне, а король на 8-м. Чтобы захватить пешку, король должен находиться в том же файле или рядом с ним.

    Результат: q = 7 ⋀ y = 8 → |x - p| ≤ 1

  2. Пешка находится на 7 уровне. Чтобы поймать пешку, король должен находиться в шести файлах.

    Результат: q = 7 → |x - p| ≤ 6

  3. Пешка находится на более низком уровне. Чтобы поймать пешку, король должен быть в состоянии достичь поля повышения не более чем за один ход после пешки.

    Результат: q < 7 → |x - p| ≤ q ⋀ y - 1 ≤ q

Мое решение как раз в этих условиях. Надеюсь, на этот раз ошибок нет.

GRC
источник
2
Как насчет резки absс max(y-1,x-p,p-x)?
xnor
Не должно f(1,8,1,7)быть, Trueпотому что король немедленно захватывает пешку? Я думаю, что есть тонкость, когда пешечный ряд 7 не может рассматриваться как ряд 6, если король немедленно захватывает.
xnor
@xnor Я думаю, что это сейчас исправлено (в плохой манере игры).
grc
1
Если вы изменили последнее условие, вы можете удалить пробел между orи -2.
xsot
@xsot спасибо за совет. Я изменил свой подход, и теперь я немного его сломал.
grc
2

Пролог, 48 42 байта

Код:

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

Примеры:

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

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

Неплохой вызов для Пролога по сравнению с большинством.

Изменить: Сохранение 6 байтов путем переключения на формулу, используемую в ответе GRC's Python 2 .
К сожалению, Пролог не может связать сравнения как Python, а целочисленное деление на 1 байт длиннее, чем деление с плавающей запятой.

Попробуйте онлайн здесь

Emigna
источник
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)

Я надеюсь сохранить байты без использования Math.abs, Math.min, Math.max

Пешка в седьмом ряду может избежать перемещения 2 пробелов, если и только если король не находится в ближайшем столбце - вот почему dперед заменой 7 на 6 стоит проверка .

Тестовый пример для запуска в консоли:

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

Результат: [true, true, true, true, false, false, false]

edc65
источник
0

Рубин, 50 байтов

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

Аргументы: (король x, король y, пешка x, пешка y), все целые числа.

PellMell
источник