Напишите функцию 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) прекрасно проходит все проверки.
Посмотреть код
Решение
def can_eat(horse, cell):
x = abs(horse[0] - cell[0])
y = abs(horse[1] - cell[1])
return sorted([x, y]) == [1, 2]
Решение
def can_eat(horse, cell):
x = abs(horse[0] - cell[0])
y = abs(horse[1] - cell[1])
return {x, y} == {1, 2}
я видимо не ищу лёгких путей))
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 использовать для сравнения
Это все с опытом приходит. Поэтому я этот ресурс и сделал, чтобы можно было посмотреть “А как еще можно было”.
как небольшая альтернатива
def can_eat(pos1, pos2):
if abs(pos1[0] – pos2[0]) + abs(pos1[1] – pos2[1]) == 3:
return True
else:
return False
Недостаток этого решения в том, что если в одной паре координат разница будет 3, а во второй 0, то функция вернет True.