G. Шахматный «обед»

Напишите функцию can_eat, которая принимает положение коня и другой фигуры в виде кортежей из двух координат, а возвращает булево значение: True если конь съедает фигуру и False иначе.

Примечание

Ваше решение должно содержать только функции.
В решении не должно быть вызовов требуемых функций.

Пример

Ввод

result = can_eat((2, 1), (4, 2))

Вывод

result = True

Ввод

result = can_eat((5, 5), (6, 6))

Вывод

result = False

Решение

Для решения этой задачи нам нужно вспомнить как ходит конь в шахматах. Если описывать его ход с точки зрения математики, то это всегда смещение на одно поле в любом направлении и потом на два в любом направлении по горизонтали или вертикали, перпендикулярном направлении. Можно описать и наоборот – сначала смещение на два поля, потом на одно.

Получается, что расстояние до клеток до которых может “дотянуться” конь можно описать формулой sorted(x, y) = (1, 2) или {x, y} == {1, 2}. Остается вычислить расстояние от текущей позиции коня до интересующей нас клетки. Так как в обозначенной выше формуле участвуют только положительные числа, нас интересует абсолютное расстояние. Вычисляем абсолютную разницу между координатам по x и абсолютную разницу между координатами по y.

По состоянию на 02 июня 2024 года в тестах Яндекса есть ошибка – код, считающий, что конь с a1 может атаковать клетку a4 (x + y == 3) прекрасно проходит все проверки.

Посмотреть код

Решение

Python
def can_eat(horse, cell):
    x = abs(horse[0] - cell[0])
    y = abs(horse[1] - cell[1])
    return sorted([x, y]) == [1, 2]

Решение

Python
def can_eat(horse, cell):
    x = abs(horse[0] - cell[0])
    y = abs(horse[1] - cell[1])
    return {x, y} == {1, 2}
Подписаться
Уведомить о
guest
4 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
nmalkam
15.12.2023 08:34

я видимо не ищу лёгких путей))

def can_eat(p_horse: tuple, p_eat: tuple) -> bool:
from itertools import product
p_eat = list(p_eat)
p_horse = (str(p_horse[0])), str(p_horse[1])
horse_step = [‘+2’, ‘+1’, ‘-2’, ‘-1’]
POSITIONS = list(product(p_horse, horse_step, repeat=2))
numbers_right_positions_horse = [5, 7, 21, 23,
12, 14, 28, 30]
p_p_h = []
for index in numbers_right_positions_horse:
p_p_h.append(POSITIONS[index])
possible_positions_horse = []
for a, b, c, d in p_p_h:
pos = [eval(a + b), eval(c + d)]
if pos[0] in range(1, 9) and pos[1] in range(1, 9):
possible_positions_horse.append(pos)
if p_eat in possible_positions_horse:
return True
return False

изящное решение со сравнением разницы координат позиций, жаль для меня оно было не на поверхности))

только увидев ваш код понял что можно не только класс set использовать для сравнения

sorted([x, y]) == [1, 2]

Сергей
Сергей
02.06.2024 12:35

как небольшая альтернатива

def can_eat(pos1, pos2):
    if abs(pos1[0] – pos2[0]) + abs(pos1[1] – pos2[1]) == 3:
        return True
    else:
        return False