Alternatywna nazwa: ChessMoveQ
Biorąc pod uwagę listę do 32 elementów, z których każdy składa się z 4 elementów, oraz drugą listę z 4 elementami, określ, czy ruch wyszczególniony w drugim wejściu jest prawidłowym ruchem w szachy.
Pierwsza lista wskazuje pozycję wszystkich 32 elementów na planszy. Każdy element będzie podążał za strukturą <colour>, <piece-name>, <x-coord>, <y-coord>
, np. ["W", "K", 5, 1]
, Która wskazuje, że biały król jest włączony 5, 1
( e1
na normalnej szachownicy). Wszystkie elementy pierwszego wejścia będą unikalne. <x-coord>
i <y-coord>
zawsze będzie wynosić od 1 do 8. Jednym z przykładów będzie:
[["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]]
który reprezentowałby zarząd:
Drugie wejście będzie się składać z tych samych struktur, co podlisty pierwszego, ale zamiast współrzędnych xiy wskazujących, gdzie jest kawałek, wskazują one, dokąd próbuje się przenieść.
W powyższym przykładzie prawidłowym ruchem może być ["W", "B", 4, 3]
(biskup przesuwa się o jedno pole do przodu i w lewo), a nieprawidłowy ruch może być taki, ["B", "R", 4, 1]
jak wieża musiałaby przejść przez rycerza i pionka, aby dostać się na plac. Ponieważ ruch może odnosić się jednocześnie do wielu elementów, musisz sprawdzić, czy któryś z określonych elementów może wykonać ruch, a nie tylko jeden z nich. Na przykład pierwszy przykład dotyczy tylko jednego biskupa, ale nadal jest to ważny ruch. Jednak żadna czarna wieża nie może wykonać drugiego ruchu, więc jest nieważna.
Twoim zadaniem jest ustalenie, czy ruch wyszczególniony w drugim wejściu jest prawidłowym ruchem w szachy. Ważność reguły jest różna w zależności od elementu, który próbuje się poruszyć (kliknij nazwę elementu, aby zobaczyć schemat prawidłowych ruchów):
- Dowolny element : Żaden element nie może przejść na już zajęty kwadrat lub poza planszę, chyba że ten kwadrat jest zajęty przez element innego koloru. Na przykład biały kawałek może przejść na kwadrat zajmowany przez czarny kawałek, ale nie biały. Ponadto żadne pionki, z wyjątkiem Rycerzy, nie mogą poruszać się na pola, które są bezpośrednio zasłonięte przez inny element.
- Przejście przez kawałek B do kwadratu C jest „bezpośrednio opór” na sztuki A jeśli jest bezpośrednio w prostej (prostopadłe lub skośne) linia pomiędzy B i C .
- Dowolny element : pozycja króla może również wpływać na ważność ruchu elementu. Jeśli którykolwiek z tych dwóch warunków jest spełniony, ruch jest nieprawidłowy:
- Wystawiając króla na sprawdzenie, przesuwając pionek po tej samej stronie, co zagrożony król. Dotyczy to tylko sytuacji, gdy pionek przeciwny wykona ruch, a nie pionek przeciwny przesunie się, aby umieścić króla w ryzach.
- Pozostawiając króla w ryzach, w takim przypadku musi się wyprowadzić z kręgu. Dlatego jeśli król jest w szachu, a ruch nakazuje ruch innego elementu, jest to ruch nieważny, chyba że ten drugi element uniemożliwia sprawdzenie. Kawałek może zapobiec czekowi na jeden z dwóch sposobów: albo bierze czek wykonujący kawałek, albo przeszkadza ścieżce między czekiem wykonującym a królem.
- „Czek” to sytuacja, w której przeciwnik króla mógłby (jeśli nadejdzie ich kolej, aby wykonać ruch) legalnie przesunąć pionek na tego króla. Zasada ta nie ma zastosowania rekurencyjnego, tzn. Król jest w szachu, nawet jeśli ruch przeciwnika na tego króla pozostawiłby swojego króla w szachu.
- Pionki : pionek może poruszać się do przodu (tj. Do góry, jeśli jest biały, w dół, jeśli jest czarny) o jedno pole do niezajętego pola. Istnieją również trzy specjalne sytuacje:
- Jeśli pion jeszcze się nie poruszył (możesz to ustalić za pomocą współrzędnej Y; białe pionki nie poruszyły się, jeśli ich współrzędna Y wynosi 2, czarne pionki nie poruszyły się, jeśli ich współrzędna Y wynosi 7), pionek wolno przesuwać się o dwa pola do przodu na wolne pole.
- Jeśli pionek przeciwnika znajduje się po przekątnej przed pionkiem (tj. Na placu na północny zachód lub północny wschód od pionka, jeśli jest biały, lub na południowy zachód lub południowy wschód, jeśli jest czarny), pionek może poruszać się na zajmowanym polu.
- Jeśli pionek przesunie się do ostatecznej współrzędnej Y (8 dla białych lub 1 dla czarnych) w normalnych zasadach szachowych, musi zostać awansowany na królową, wieżę, rycerza lub biskupa tego samego koloru. Do celów tego pytania wybór awansu nie ma znaczenia, czy ruch jest ważny, czy nie (i nie może być wyrażony w formacie wejściowym), ale ruchy pionków, które spowodowałyby awans, muszą być dozwolone.
- Biskupi : Biskupi mogą poruszać się między 1 a 8 kwadratami wzdłuż dowolnej ciągłej, nieprzeszkadzanej ścieżki międzysercowej (tj. Ukośnej).
- Rycerze : Rycerze mogą się poruszać w
L
kształcie składającym się z jednego z następujących (równoważnych) ruchów:- Pojedynczy kwadrat w dowolnym kierunku kardynalnym, następnie obrót o 90/270 °, a następnie ostatni ruch o 2 pola do przodu.
- 2 kwadraty w dowolnym kierunku głównym, następnie obrót o 90/270 °, a następnie ostatni ruch o jedno pole do przodu.
- Gawrony : Gawrony mogą poruszać się między 1 a 8 kwadratami wzdłuż dowolnej ciągłej, nie zasłoniętej ścieżki głównej.
- Królowe : Królowe mogą poruszać się między 1 a 8 kwadratami wzdłuż dowolnej ciągłej ścieżki kardynalnej lub międzysercowej (tj. Ukośnej) bez przeszkód.
- Królowie : królowie poruszają się jak królowe, z tym, że ograniczają się do ruchu tylko o jedno pole na ruch (tzn. Król może poruszać się tylko na sąsiednie pola kardynalnie lub ukośnie). Przypominamy, że nie możesz wykonać ruchu, który pozostawia króla w ryzach; dlatego też nie możesz przenieść swojego króla na szach.
Reguły szachowe zawierają także specjalne ruchy zwane „roszowaniem” i „en passant”. Ponieważ jednak legalność tych ruchów zależy od historii gry, a nie tylko od bieżącej pozycji (a ponieważ castling wymaga przesunięcia dwóch elementów jednocześnie, co nie pasuje do formatu wejściowego), nie należy brać pod uwagę żadnego z tych ruchów istnieć (tj. ruch, który byłby rażący lub en passant, należy uznać za nielegalny).
Możesz wygenerować dowolne dwa różne wyniki, aby wskazać ważność ruchu, i możesz wprowadzić dane wejściowe wybraną metodą. Jeśli wolisz, możesz także wybrać indeksowanie 0 zamiast indeksowania 1 dla pozycji. To jest golf golfowy , więc wygrywa najkrótszy kod!
Przypadki testowe
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)
To wyzwanie zostało piaskownicy . Otrzymał recenzje, bez żadnego wyjaśnienia, więc i tak zdecydowałem się opublikować