«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Про шахматную доску

Про шахматную доску

Опубликовано 27 августа 2024 г.
Просматривать:517

Еженедельный вызов 281

Извините, что был пропавшим без вести в течение последних нескольких недель. Я переехал и нашел новую работу, поэтому за это время у меня не было возможности принять участие в испытаниях.

Каждую неделю Мохаммад С. Анвар рассылает «Еженедельный вызов», который дает всем нам возможность придумать решения двух еженедельных задач. Мои решения сначала пишутся на Python, а затем конвертируются в Perl. Для всех нас это отличный способ попрактиковаться в программировании.

Задача, мои решения

Задача 1. Проверка цвета

Задача

Вам заданы координаты — строка, представляющая координаты клетки шахматной доски, как показано ниже:

The one about a chess board

Напишите скрипт, который будет возвращать true, если квадрат светлый, и false, если квадрат темный.

Мое решение

Это относительно просто. Первое, что я делаю, это проверяю, что предоставленная позиция действительна (первый символ — a-h, а второй символ — от 1 до 8).

Затем я проверяю, является ли первая буква a, c, e или g, а число четным, или первая буква — b, d, f или h, а число нечетное, и возвращаю true. В противном случае верните false.

def check_color(coords: str) -> bool:
    if not re.search('^[a-h][1-8]$', coords):
        raise ValueError('Not a valid chess coordinate!')

    if coords[0] in ('a', 'c', 'e', 'g') and int(coords[1]) % 2 == 0:
        return True
    if coords[0] in ('b', 'd', 'f', 'h') and int(coords[1]) % 2 == 1:
        return True
    return False

Примеры

$ ./ch-1.py d3
true

$ ./ch-1.py g5
false

$ ./ch-1.py e6
true

Задача 2: Ход коня

Задача

Конь в шахматах может переместиться из своей текущей позиции в любую клетку на две строки или столбца плюс одну колонку или строку дальше. Итак, на диаграмме ниже, если он начинает с буквы S, он может переместиться в любой из квадратов, отмеченных буквой E.

The one about a chess board

Напишите скрипт, который принимает начальную и конечную позиции и рассчитывает наименьшее количество необходимых ходов.

Мое решение

Это более подробно. Я начинаю со следующих переменных:

  • deltas — это кортежи списков (массив массивов в Perl) с восемью способами, которыми рыцарь может переместиться из своей текущей позиции.
  • target — это ячейка, которую мы хотим достичь. Для этого я преобразую первую букву в число от одного до 8. Оно сохраняется в виде кортежа, первое значение — это столбец, а второе значение — строка.
  • ходы – это количество сделанных ходов, начиная с одного.
  • видели — это список ячеек, которые мы уже посетили.
  • coords — список текущих позиций рыцаря. Он начинается с начальной координаты.
def knights_move(start_coord: str, end_coord: str) -> int:
    for coord in (start_coord, end_coord):
        if not re.search('^[a-h][1-8]$', coord):
            raise ValueError(
                f'The position {coord} is not a valid chess coordinate!')

    deltas = ([2, 1], [2, -1], [-2, 1], [-2, -1],
              [1, 2], [1, -2], [-1, 2], [-1, -2])
    coords = [convert_coord_to_list(start_coord)]
    target = convert_coord_to_list(end_coord)
    moves = 1
    seen = []

Затем у меня есть двойной цикл текущего списка координат и списка дельт. Установите переменную new_pos, которая представляет новые координаты рыцаря. Если это приводит к позиции за пределами доски или координатам, в которых мы уже были, я пропускаю это. Если он попадает в цель, я возвращаю значение хода.

После цикла я сбрасываю список координат на координаты, собранные в ходе итераций, и увеличиваю значение перемещений на единицу. Это продолжается до тех пор, пока мы не достигнем целевой координаты.

    while True:
        new_coords = []

        for coord in coords:
            for delta in deltas:
                new_pos = (coord[0]   delta[0], coord[1]   delta[1])

                if not 0 



Примеры

$ ./ch-2.py g2 a8
4

$ ./ch-2.py g2 h2
3
Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/simongreennet/the-one-about-a-chess-board-57mh?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3