Problema:
Negli scacchi, esiste una regola in qualche modo ben nota sul pareggio per ripetizione. Se la stessa posizione viene ripetuta 3 volte (o più), il giocatore che intende effettuare la mossa che causerà questa ripetizione può richiedere un pareggio.
A volte questo è un compito facile da individuare per un arbitro, se le ultime mosse sono solo i giocatori che si muovono avanti e indietro. A volte è meno banale, quando i pezzi si sono spostati in modo significativo tra posizioni ripetute.
Il problema in questa sfida è quello di produrre un valore di verità se la posizione richiesta è disegnata per ripetizione (è stata vista 3 volte o più) e un valore di falsa se la posizione richiesta non è disegnata per ripetizione, dato un elenco di mosse in notazione coordinata come descritto di seguito o qualsiasi notazione di tua scelta (ma dovrai convertire i casi di test).
Che cos'è una posizione?
In uno scenario del mondo reale, la posizione sarebbe influenzata da cose come se un giocatore può castigare o se è possibile l'invasore; si dovrebbe non prendere in considerazione questi nella vostra soluzione al problema. In questo problema una posizione è definita semplicemente dalla configurazione dei pezzi sulla scacchiera. Quindi, ai fini di questo problema, due posizioni sono considerate uguali se ogni quadrato su entrambe le assi è occupato dallo stesso tipo di pezzo dello stesso colore. Questo non deve essere il pezzo esatto, ad esempio i cavalieri bianchi potrebbero scambiare i quadrati e se tutti gli altri pezzi soddisfano i criteri questa sarebbe comunque la stessa posizione.
Che aspetto ha una notazione valida?
Sebbene continuerò a spiegare la notazione delle coordinate, sei libero di ricevere input da un sistema di notazione che scegli. Purché:
- Ogni articolo nella notazione descrive alcuni o tutti: il pezzo / i pezzi coinvolti; se sono stati consegnati check, checkmate, double check, checkmate o stallo; se si è verificata l'acquisizione en-passant; la posizione iniziale; la posizione finale.
- Potresti non avere informazioni sulla ripetizione nella tua notazione.
Quindi, fintanto che questi criteri sono soddisfatti, sono felice di accettare, fintanto che specifichi nella tua risposta, il tuo sistema di notazione. Questo potrebbe essere ad esempio 0 righe indicizzate, tuple di colonne o qualunque cosa abbia senso per il tuo programma.
Notazione coordinata
La notazione di coordinate è una notazione che descrive semplicemente le mosse come un sistema di coordinate.
Una mossa viene descritta come prima la coordinata iniziale dall'insieme {A1-H8}
e poi di nuovo la coordinata di destinazione dallo stesso insieme. Quindi il King's Gambit sarebbe simile (come una raccolta di stringhe)
{"E2-E4","E7-E5","F2-F4"}
Credo che sia la migliore notazione da utilizzare per questo problema perché non è disseminata di informazioni estranee come se si è verificato un controllo o quale sia il tipo di movimento del pezzo. Come accennato in precedenza, la notazione può essere di vostra scelta, quindi è possibile utilizzare un'altra notazione, ad esempio notazione algebrica o è possibile adattare questa notazione (ad esempio rimuovere i trattini o prendere come elenco di tuple)
Regole:
- Si dovrebbe non considerare se una posizione o mossa è valida, solo se si provoca la ripetizione
- Puoi presumere che non si verifichino promozioni per il castling e il pedone .
- Dovresti prendere un elenco di stringhe come input e produrre un valore di verità o falsità corrispondente al fatto che si sia verificata la terza (o più) ripetizione nell'ultima mossa
- Il gioco inizia sempre nella posizione di partenza standard per gli scacchi. La posizione iniziale può contare per la ripetizione.
- Il pareggio per ripetizione non si è verificato se la posizione non è ripetuta dalla mossa finale
Regole generali:
- Questo è code-golf , quindi vince la risposta più breve in byte.
Non lasciare che le lingue di code-golf ti scoraggino dal pubblicare risposte con lingue non codegolfing. Prova a trovare una risposta il più breve possibile per "qualsiasi" linguaggio di programmazione. - Per la tua risposta valgono regole standard con regole I / O predefinite , quindi puoi usare STDIN / STDOUT, funzioni / metodo con i parametri corretti e tipo di ritorno, programmi completi. La tua chiamata.
- Le scappatoie predefinite sono vietate.
- Se possibile, aggiungi un link con un test per il tuo codice (ad es. TIO ).
- Inoltre, si consiglia vivamente di aggiungere una spiegazione per la risposta.
Casi test
Dovresti restituire valori veritieri per:
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","D2-D4","D7-D5","D1-D3","D8-D6","C3-B1","C6-B8","B1-C3","B8-C6","D3-D1","D6-D8","D1-D3","D8-D6"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-E6","E2-F3","E6-D4","F3-D1","D4-C6","D1-E2","C6-D4","E1-D1","D4-C6","D1-E1","C6-D4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3"}
E valori falsi per:
{}
{"E2-E4","E7-E5","F2-F4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","F2-F4","F7-F5"}
{"E2-E4","E7-E5","G1-F3","B8-C6","F1-C4","G8-F6","F3-G5","D7-D5","E4-D5","F6-D5","G5-F7"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-C6","E2-D1","C6-D4","D1-E2","D4-C6","E2-D1"}
{"B1-C3","B8-C6","C3-B5","C6-B4","B5-D4","B4-D5","D4-C6","D5-C3","C6-B8","C3-B1","B8-C6","B1-C3","C6-B8","C3-B1"}
{"E2-E4","E7-E5","D1-E2","E8-E7","E1-D1","D8-E8","E2-E1","E7-D8","E1-E2","E8-E7","E2-E1","E7-E8"}
C6-B8
è verificata tre volte la posizione iniziale.