Альтернативное имя: ChessMoveQ
Учитывая список до 32 элементов, каждый из которых состоит из 4 элементов, и второй список с 4 элементами, определите, является ли ход, описанный во втором входе, допустимым ходом шахмат.
Первый список указывает положение всех 32 фигур на доске. Каждый элемент будет следовать структуре <colour>, <piece-name>, <x-coord>, <y-coord>
, например ["W", "K", 5, 1]
, которая указывает, что белый король включен 5, 1
( e1
на обычной шахматной доске). Все элементы первого ввода будут уникальными. <x-coord>
и <y-coord>
всегда будет между 1 и 8. Один из примеров:
[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8],
["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7],
["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7],
["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3],
["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1],
["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2],
["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
который будет представлять доску:
Второй вход будет состоять из тех же структур, что и подсписки первого, но вместо координат x и y, указывающих, где находится фрагмент, они указывают, куда он пытается переместиться.
В приведенном выше примере допустимым может быть движение ["W", "B", 4, 3]
(слон передвигается на одну клетку вперед и влево), а недопустимым может быть то, ["B", "R", 4, 1]
что ладья должна пройти через коня и пешку, чтобы добраться до квадрата. Поскольку ход может относиться к нескольким фигурам время от времени, вы должны проверить, может ли какой-либо из указанных кусков сделать ход, а не только один из них. Например, первый пример действителен только для одного слона, но это все еще действительный ход. Однако ни одна черная ладья не может выполнить второй ход, поэтому она недействительна.
Ваша задача - определить, является ли ход, описанный во втором входе, допустимым ходом в шахматах. Срок действия правила варьируется в зависимости от фигуры, которая пытается переместиться (нажмите на название фигуры для диаграммы действительных ходов):
- Любая фигура : Никакие фигуры не могут перемещаться на уже занятый квадрат или с доски, если только этот квадрат не занят частью другого цвета. Например, белая фигура может переместиться на квадрат, занятый черной фигурой, но не белая фигура. Кроме того, никакие фигуры, кроме Рыцарей, не могут перемещаться на квадраты, которые непосредственно закрыты другим куском.
- Движение по частям B квадратного C является «непосредственно препятствуют» по частям А , если непосредственно, в прямом (ортогонально или диагонали) линии, между B и C .
- Любая фигура : позиция короля также может влиять на достоверность хода фигуры. Если любое из этих двух условий выполнено, перемещение недействительно:
- Выставив короля на проверку, переместив фигуру на ту же сторону, что и находящийся под угрозой исчезновения король. Это применимо только в том случае, если не противостоящая фигура делает ход, а не противостоящая фигура, движущаяся, чтобы поставить короля под контроль.
- Оставить короля под контролем, и в этом случае он должен выйти из-под контроля. Поэтому, если король находится под контролем, и ход диктует, что другая фигура движется, это недопустимый ход, если только другая фигура не препятствует проверке. Часть может предотвратить проверку одним из двух способов: либо она берет часть, выполняющую проверку, либо затрудняет путь между частью, выполняющей проверку, и королем.
- «Проверка» - это ситуация, в которой противник короля может (если это была их очередь двигаться) легально переместить фигуру на этого короля. Это правило не применяется рекурсивно, т. Е. Король находится под контролем, даже если ход противника на этого короля оставляет своего короля под контролем.
- Пешки : пешка может двигаться вперед (то есть вверх, если белый, вниз, если черный) на один квадрат к незанятому. Есть также три особых ситуации:
- Если пешка еще не сдвинулась (вы можете определить это с помощью Y-координаты; белые пешки не сместились, если их Y-координата равна 2, черные пешки не сместились, если их Y-координата равна 7), пешка разрешено перемещать два квадрата вперед на незанятый квадрат.
- Если фигура противника находится по диагонали перед пешкой (то есть на квадрате к северо-западу или северо-востоку от пешки, если она белая, или к юго-западу или юго-востоку, если она черная), пешке разрешено двигаться на рассматриваемый квадрат.
- Если пешка перемещается к конечной координате Y (8 для белых или 1 для черных) в нормальных шахматных правилах, она должна быть повышена до ферзя, ладьи, рыцаря или слона того же цвета. Для целей этого вопроса выбор продвижения не имеет значения, является ли ход действительным или нет (и не может быть выражен в формате ввода), но ходы пешки, которые приведут к продвижению, должны быть разрешены.
- Епископы : Епископы могут перемещаться между 1 и 8 квадратами по любому непрерывному беспрепятственному межкардинальному (то есть диагональному) пути.
- Рыцари : Рыцари могут двигаться в
L
форме, состоящей из следующих (эквивалентных) ходов:- Один квадрат в любом кардинальном направлении, затем поворот на 90/270 °, за которым следует последний шаг вперед на 2 клетки.
- 2 квадрата в любом кардинальном направлении, затем поворот на 90/270 °, за которым следует последний шаг вперед на один квадрат.
- Грачи : Грачи могут перемещаться между 1 и 8 квадратами по любому непрерывному беспрепятственному кардинальному пути.
- Королевы : Королевы могут перемещаться между 1 и 8 квадратами по любому непрерывному кардинальному или межкардинальному (то есть диагональному) беспрепятственному пути.
- Короли : Короли движутся как королевы, за исключением того, что они ограничены перемещением только одного квадрата за ход (то есть король может перемещаться только в смежные по кардинальным или диагональным квадратам). Как напоминание, вы не можете сделать ход, который оставляет вашего короля в узде; таким образом, вы также не можете контролировать своего короля.
Правила шахмат также содержат специальные ходы, называемые «рокировка» и «en passant». Однако, поскольку законность этих ходов зависит от истории игры, а не только от текущей позиции (и потому что для рокировки требуется перемещение двух фигур одновременно, что не соответствует формату ввода), вы не должны рассматривать ни один из этих ходов. существовать (т. е. ход, который был бы рокировочным или пассивным, должен считаться незаконным).
Вы можете выводить любые два разных результата, чтобы указать правильность хода, и вы можете использовать вход любым способом. Вы также можете выбрать 0-индексацию вместо 1-индексации для позиций, если вы предпочитаете. Это код-гольф , поэтому выигрывает самый короткий код!
Контрольные примеры
Board
Move => Output (Reason)
[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8], ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7], ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7], ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3], ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1], ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2], ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
["W", "R", 8, 2] => True (The rook on h1 can move forward one)
[['B', 'K', 6, 8], ['B', 'Q', 1, 7], ['B', 'N', 1, 3], ['B', 'N', 7, 1], ['B', 'B', 8, 8], ['B', 'B', 2, 5], ['B', 'R', 4, 3], ['B', 'R', 1, 5], ['B', 'P', 5, 5], ['B', 'P', 7, 2], ['B', 'P', 5, 7], ['B', 'P', 5, 6], ['B', 'P', 4, 4], ['W', 'K', 7, 3], ['W', 'Q', 3, 2], ['W', 'N', 4, 8], ['W', 'N', 7, 5], ['W', 'B', 1, 1], ['W', 'B', 8, 1], ['W', 'R', 1, 8], ['W', 'R', 3, 7], ['W', 'P', 8, 2], ['W', 'P', 6, 3], ['W', 'P', 4, 2], ['W', 'P', 1, 4], ['W', 'P', 8, 7]]
['W', 'N', 1, 5] => False (Neither knight to move to a5 from where they are)
[['B', 'K', 7, 3], ['B', 'Q', 2, 4], ['B', 'N', 5, 2], ['B', 'N', 1, 6], ['B', 'B', 7, 7], ['B', 'B', 1, 8], ['W', 'K', 7, 1], ['W', 'Q', 6, 1], ['W', 'N', 5, 6], ['W', 'N', 3, 3], ['W', 'B', 2, 2], ['W', 'B', 6, 5]]
['B', 'K', 8, 3] => False (The white bishop would put the king in check)
[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 5, 8] => False (The white queen currently has the king in check, and this move doesn't prevent that)
[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 7, 5] => True (The king is in check, and the knight blocks that)
[['B', 'K', 8, 3], ['B', 'Q', 6, 5], ['B', 'N', 7, 8], ['B', 'N', 3, 7], ['B', 'B', 4, 1], ['B', 'B', 1, 1], ['W', 'K', 7, 7], ['W', 'Q', 7, 1], ['W', 'N', 2, 2], ['W', 'N', 1, 3], ['W', 'B', 3, 5]]
['B', 'B', 2, 2] => True (takes the white knight)
[['B', 'K', 6, 1], ['B', 'Q', 6, 2], ['W', 'K', 8, 1]]
['B', 'Q', 7, 1] => True (Smallest checkmate possible, in terms of bounding box)
Этот вызов был изолирован . Он получил отрицательные отзывы, без каких-либо объяснений, поэтому я решил опубликовать его в любом случае