Інша назва: 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 квадратами по будь-якому безперервному кардинальному або міжкардинальному (тобто діагональному) шляху, що не перешкоджає.
- Королі : Королі рухаються як королеви, за винятком того, що вони обмежуються переміщенням лише одного квадрата за хід (тобто король може рухатися лише до кардинально або по діагоналі сусідніх квадратів). Нагадування, ви не можете зробити хід, який залишає вашого короля під контролем; таким чином, ви також не можете перемістити свого короля.
Правила шахів також містять спеціальні рухи, які називаються "заклинками" та "ен-пасантом". Однак, оскільки законність цих ходів залежить від історії гри, а не тільки від поточної позиції (а тому, що для виведення потрібно перенести дві частини одразу, що не відповідає формату введення), ви не повинні розглядати жоден з цих кроків існувати (тобто такий крок, який би був рольовим або прохідним, слід вважати незаконним).
Ви можете вивести будь-які два різних результату для вказівки дійсності переміщення, і ви можете взяти вхід у бажаному методі. Ви також можете вибрати 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)
Цей виклик був пісочницею . Він отримав знищення без будь-яких пояснень, тому я все-таки вирішив опублікувати його