Извините, что был пропавшим без вести в течение последних нескольких недель. Я переехал и нашел новую работу, поэтому за это время у меня не было возможности принять участие в испытаниях.
Каждую неделю Мохаммад С. Анвар рассылает «Еженедельный вызов», который дает всем нам возможность придумать решения двух еженедельных задач. Мои решения сначала пишутся на Python, а затем конвертируются в Perl. Для всех нас это отличный способ попрактиковаться в программировании.
Задача, мои решения
Вам заданы координаты — строка, представляющая координаты клетки шахматной доски, как показано ниже:
Напишите скрипт, который будет возвращать 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
Конь в шахматах может переместиться из своей текущей позиции в любую клетку на две строки или столбца плюс одну колонку или строку дальше. Итак, на диаграмме ниже, если он начинает с буквы S, он может переместиться в любой из квадратов, отмеченных буквой E.
Напишите скрипт, который принимает начальную и конечную позиции и рассчитывает наименьшее количество необходимых ходов.
Это более подробно. Я начинаю со следующих переменных:
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
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3