Comments 17
Ход короля также можно решить через расстояние между клетками (теорему Пифагора):
x1, y1, x2, y2 = int(input()), int(input()), int(input()), int(input())
if (x1 - x2) ** 2 + (y1 - y2) ** 2 <= 2:
print('YES')
else:
print('NO')
Или более продвинуто через модуль разности соответствующих координат и отсортированный список:
x1, y1, x2, y2 = int(input()), int(input()), int(input()), int(input())
if sorted([abs(x1 - x2), abs(y1 - y2)])[1] == 1:
print('YES')
else:
print('NO')
или через модуль разности соответствующих координат и сравнение с множеством:
x1, y1, x2, y2 = int(input()), int(input()), int(input()), int(input())
if {abs(x1 - x2), abs(y1 - y2)} <= {0, 1}:
print('YES')
else:
print('NO')
Игра в шахматы - это неизбежная оптимизация по времени.
Думаю, что некоторые вещи лучше не пытаться как-то упростить. Наверное вот это (предположение):
x1, y1, x2, y2 = int(input()), int(input()), int(input()), int(input())
if (x1 == x2) or (y1 == y2):
print('YES')
else:
print('NO')
Лучше вот этого:
x1, y1, x2, y2 = int(input()), int(input()), int(input()), int(input())
if (x1 - x2) * (y1 - y2) == 0:
print('YES')
else:
print('NO')
По скорости работы. Возможно стоит об этом написать в статье.
Безотносительно шахмат, это в целом очень плохой стиль программирования - без веской причины (оптимизация) заменять логическое выражение в терминах бизнес логики (и отсюда легко понятное человеку) на заковыристое выражение с эквивалентным результатом чтобы было меньше на пару строчек. А тут и строчек столько же и быстродействие хуже.
Странно, что вас заминусовали. Возможно не поняли, что вы поддержали сообщение, на которое отвечаете
Шахматы вообще штука неочевидная. Как будто бы, каждая фигура сама за себя, и ООП просится с базовым классом Фигура (понятно, что перфа там не будет, но, это, если с упором на понятность писать), но, копнешь глубже, и нет, не сама за себя. И за возможность на проходе срубить пешку помнить надо, и за факт того, что король походил, и за то, не открываешь ли своего короля на шах ходом. То есть, приходим уже не к хождениям отдельных юнитов, а к стейту доски (включая переменные, скрытые в истории ходов, и невидимые на доске) и возможности изменить его в другой.
Переход на умножение это никакая не оптимизация - какая следующая фича будет запрошена? Правильно, проверять есть ли на пути другая фигура. В итоге "оптимизация" будет просто выкинутым временем
Если вас беспокоит скорость выполнения, вообще не надо брать питон.
В большинстве примеров содержится логическая ошибка — выдается ответ YES, когда начальное и конечное поле совпадают.
Логической ошибки нет, потому что по условию задачи гарантируется, что подаются различные клетки шахматной доски:

Это лучше проверять вне зависимости от фигуры чем для каждой фигуры дублировать код
Слабоумие и отвага... но это не точно!
%%ipytest
import sys
import pytest
from loguru import logger
# Function
def chess_board(
numbers: list[str | int],
is_stdin: bool
) -> str:
logger.debug(f"{numbers=}, {type(numbers)}")
logger.debug(f"{is_stdin=}, {type(is_stdin)}")
for value, value_type in zip(
(numbers, is_stdin),
(list, bool)
):
if not isinstance(value, value_type):
error_message: str = "Некорректный тип данных;"
logger.error(error_message)
raise TypeError(error_message)
if is_stdin:
try:
logger.info("Преобразование типов элементов списка из str в int;")
numbers: list[int] = [int(x) for x in numbers]
except ValueError:
error_message: str = f"Некорректное значение. Невозможно преобразовать {x=} в int;"
logger.error(error_message)
raise ValueError(error_message)
else:
logger.info("Проверка типов элементов списка;")
if not all(isinstance(x, int) for x in numbers):
error_message: str = "Некорректный тип данных элемента;"
logger.error(error_message)
raise TypeError(error_message)
return "YES" if sum(numbers) % 2 == 0 else "NO"
@pytest.mark.parametrize(
["test_numbers", "test_is_stdin", "expected_result"],
[
# Good cases
([1, 1, 2, 6], False, "YES"),
([2, 2, 2, 5], False, "NO"),
([2, 3, 8, 8], False, "NO"),
(["1\n", "1\n", "2\n", "6"], True, "YES"),
(["2\n", "2\n", "2\n", "5"], True, "NO"),
(["2\n", "3\n", "8\n", "8"], True, "NO"),
# Error cases
("1 2 3 4", False, TypeError),
((1, 2, 3, 4), False, TypeError),
(1234, False, TypeError)
]
)
def test_chess_board(
test_numbers: list[str | int],
test_is_stdin: bool,
expected_result: str
) -> None:
if test_numbers in ["1 2 3 4", (1, 2, 3, 4), 1234]:
with pytest.raises(expected_exception=TypeError):
chess_board(
numbers=test_numbers,
is_stdin=test_is_stdin
)
else:
assert chess_board(
numbers=test_numbers,
is_stdin=test_is_stdin
) == expected_result
# Main Program
if __name__ == '__main__':
try:
logger.info("Вызов функции 'chess_board';")
print(
chess_board(
numbers=[1, 2, 3, 4],
is_stdin=False
)
)
logger.info("Успешное завершение функции 'chess_board';")
except Exception as err:
logger.error("Ошибка выполнения функции 'chess_board';")
Шахматные задачи от Поколения