Pull to refresh

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')

По скорости работы. Возможно стоит об этом написать в статье.

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

Странно, что вас заминусовали. Возможно не поняли, что вы поддержали сообщение, на которое отвечаете

Наверное) Хотя у меня был коллега, который ради того чтобы уменьшить на пять строк делал goto в середину for цикла просто потому что там уже был нужный в данный момент код и гордился этим. Может он минуснул))

Это фишка ассемблерных циклов. Так (прыжок в середину цикла) даже компилятор компилит

Шахматы вообще штука неочевидная. Как будто бы, каждая фигура сама за себя, и ООП просится с базовым классом Фигура (понятно, что перфа там не будет, но, это, если с упором на понятность писать), но, копнешь глубже, и нет, не сама за себя. И за возможность на проходе срубить пешку помнить надо, и за факт того, что король походил, и за то, не открываешь ли своего короля на шах ходом. То есть, приходим уже не к хождениям отдельных юнитов, а к стейту доски (включая переменные, скрытые в истории ходов, и невидимые на доске) и возможности изменить его в другой.

Переход на умножение это никакая не оптимизация - какая следующая фича будет запрошена? Правильно, проверять есть ли на пути другая фигура. В итоге "оптимизация" будет просто выкинутым временем

Если вас беспокоит скорость выполнения, вообще не надо брать питон.

В большинстве примеров содержится логическая ошибка — выдается ответ 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';")

Sign up to leave a comment.

Articles