Чи може цар зловити пішака?


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

Пітон 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

Моє рішення якраз у цих полях. Сподіваємось, цього разу помилок не було.


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 дякую за пораду. Я змінив свій підхід і трохи згорнув його зараз.
гр.ч.

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

Непростий виклик для Prolog порівняно з більшістю.

Редагувати: збережено 6 байт, перейшовши на формулу, що використовується у відповіді Python 2 grc .
На жаль, Prolog не може порівняти ланцюжки, оскільки python can, а ціле ділення на 1 байт довше, ніж поділ з поплавком.

Спробуйте його онлайн тут


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

Пішак у семи ряду може уникнути переміщення двох пробілів, якщо і тільки якщо король не знаходиться в найближчій колонці - ось чому відбувається перевірка 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]


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), усі цілі числа.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.