Nome alternativo: ChessMoveQ
Dato un elenco di massimo 32 elementi, ciascuno composto da 4 elementi e un secondo elenco con 4 elementi, determina se la mossa dettagliata nel secondo input è una mossa di scacchi valida.
Il primo elenco indica la posizione di tutti i 32 pezzi sulla scacchiera. Ogni elemento seguirà la struttura <colour>, <piece-name>, <x-coord>, <y-coord>
, ad esempio ["W", "K", 5, 1]
, che indica che il re bianco è acceso 5, 1
( e1
su una normale scacchiera). Tutti gli elementi del primo input saranno unici. <x-coord>
e <y-coord>
sarà sempre compreso tra 1 e 8. Un esempio potrebbe essere:
[["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]]
che rappresenterebbe il consiglio:
Il secondo input sarà costituito dalle stesse strutture delle liste secondarie del primo, ma anziché dalle coordinate xey che indicano dove si trova il pezzo, indicano dove sta cercando di spostarsi.
Per l'esempio sopra, potrebbe essere una mossa valida ["W", "B", 4, 3]
(il vescovo si sposta di una casella in avanti e a sinistra) e una mossa non valida potrebbe essere ["B", "R", 4, 1]
la torre che dovrebbe attraversare il cavaliere e il pedone per arrivare alla piazza. Poiché la mossa può riferirsi a più pezzi alla volta, è necessario verificare se uno dei pezzi specificati può effettuare la mossa, non solo uno di essi. Ad esempio, il primo esempio è valido per un solo vescovo, ma è ancora una mossa valida. Tuttavia, nessuna torre nera può eseguire la seconda mossa, quindi non è valida.
Il tuo compito è determinare se la mossa dettagliata nel secondo input è una mossa di scacchi valida. La validità di una regola varia a seconda del pezzo che tenta di muoversi (fare clic sul nome del pezzo per un diagramma delle mosse valide):
- Qualsiasi pezzo : nessun pezzo può spostarsi su un quadrato già occupato, o fuori dal tabellone, a meno che quel quadrato non sia occupato da un pezzo dell'altro colore. Ad esempio, un pezzo bianco può spostarsi su un quadrato occupato da un pezzo nero, ma non su un pezzo bianco. Inoltre, nessun pezzo, ad eccezione dei Cavalieri, può spostarsi in quadrati che sono ostruiti direttamente da un altro pezzo.
- Un'azione di pezzo B a piazzare C è "direttamente ostacolato" di pezzo A se A è direttamente in linea retta (ortogonale o diagonale), tra B e C .
- Qualsiasi pezzo : la posizione del re può anche influenzare la validità della mossa di un pezzo. Se una di queste due condizioni è soddisfatta, lo spostamento non è valido:
- Esponendo il re per controllare, spostando un pezzo sullo stesso lato del re in via di estinzione. Questo si applica solo se un pezzo non avversario fa la mossa, piuttosto che un pezzo avversario che si muove per mettere sotto controllo il re.
- Lasciare il re sotto controllo, nel qual caso deve spostarsi fuori controllo. Pertanto, se il re è sotto controllo e la mossa impone che un altro pezzo si muova, si tratta di una mossa non valida, a meno che l'altro pezzo non impedisca il controllo. Un pezzo può impedire il controllo in due modi: o prende il pezzo eseguendo il controllo, oppure ostacola il percorso tra il pezzo che esegue il controllo e il re.
- Un "check" è una situazione in cui l'avversario del re potrebbe (se fosse il suo turno di muoversi) legalmente spostare un pezzo su quel re. Questa regola non si applica in modo ricorsivo, cioè un re è sotto controllo anche se la mossa dell'avversario su quel re lascerebbe il proprio re sotto controllo.
- pedine : Un pedone può muovere in avanti (cioè verso l'alto se bianchi, verso il basso se il nero) un quadrato per una casella libera. Esistono anche tre situazioni speciali:
- Se il pedone non si è ancora mosso (puoi determinarlo usando la coordinata Y; i pedoni bianchi non si sono mossi se la loro coordinata Y è 2, i pedoni neri non si sono mossi se la loro coordinata Y è 7), il pedone è consentito spostare due quadrati in avanti verso un quadrato non occupato.
- Se c'è un pezzo di un avversario in diagonale davanti al pedone (cioè sul quadrato a nord-ovest o nord-est del pedone se è bianco, oppure a sud-ovest o sud-est se è nero), il pedone è autorizzato a spostarsi sulla piazza occupata in questione.
- Se una pedina si sposta sull'ultima coordinata Y (8 per il bianco o 1 per il nero) nelle normali regole degli scacchi, deve essere promossa a una regina, torre, cavaliere o vescovo dello stesso colore. Ai fini di questa domanda, la scelta della promozione è irrilevante se la mossa è valida o meno (e non può essere espressa nel formato di input), ma devono essere consentite le mosse di pedone che porterebbero alla promozione.
- Vescovi : i vescovi possono spostarsi tra 1 e 8 quadrati lungo qualsiasi percorso intercardinale (cioè diagonale) continuo non ostruito.
- Cavalieri : i cavalieri possono muoversi in una
L
forma, costituita da una delle seguenti mosse (equivalenti):- Un singolo quadrato in qualsiasi direzione cardinale, seguito da un giro di 90/270 °, seguito da una mossa finale di 2 quadrati in avanti.
- 2 quadrati in qualsiasi direzione cardinale, seguiti da un giro di 90/270 °, seguito da una mossa finale di un singolo quadrato in avanti.
- Corvi : i corvi possono muoversi tra 1 e 8 quadrati lungo qualsiasi percorso cardinale continuo non ostruito.
- Regine : le regine possono spostarsi tra 1 e 8 quadrati lungo qualsiasi percorso continuo cardinale o intercardinale (cioè diagonale) non ostruito.
- Re : i re si muovono come regine, tranne per il fatto che si limitano a muovere solo un quadrato per mossa (cioè un re può spostarsi solo su quadrati cardinali o diagonali adiacenti). Come promemoria, non puoi fare una mossa che lasci il tuo re sotto controllo; quindi non puoi nemmeno controllare il tuo re.
Le regole degli scacchi contengono anche mosse speciali chiamate "castling" e "en passant". Tuttavia, poiché la legalità di queste mosse dipende dalla storia del gioco, non solo dalla posizione corrente (e poiché il castling richiede di spostare due pezzi contemporaneamente, che non si adattano al formato di input), non dovresti considerare nessuna di queste mosse esistere (cioè una mossa che sarebbe castling o en passant dovrebbe essere considerata illegale).
È possibile produrre due risultati distinti per indicare la validità di uno spostamento e si può prendere l'input con il metodo desiderato. Puoi anche scegliere l'indicizzazione 0 anziché 1 per le posizioni, se preferisci. Questo è un codice-golf , quindi vince il codice più corto!
Casi test
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)
Questa sfida è stata sandbox . Ha ricevuto i voti negativi, senza alcuna spiegazione, quindi ho deciso di pubblicarlo comunque