Problema:
No xadrez, existe uma regra bem conhecida sobre o empate pela repetição. Se a mesma posição for repetida 3 vezes (ou mais), o jogador que pretender fazer a jogada que causará a repetição poderá reivindicar um empate.
Às vezes, essa é uma tarefa fácil para um árbitro detectar, se os últimos movimentos são apenas os jogadores se movendo para trás e para frente. Às vezes é menos trivial, quando as peças se movem significativamente entre posições repetidas.
O problema neste desafio é gerar um valor de verdade se a posição reivindicada for desenhada por repetição (foi vista 3 vezes ou mais) e um valor de falsey se a posição reivindicada não for desenhada por repetição, dada uma lista de movimentos na notação de coordenadas conforme descrito abaixo ou qualquer notação de sua escolha (mas você precisará converter os casos de teste).
O que é uma posição?
Em um cenário do mundo real, a posição seria afetada por coisas como se um jogador pode dominar ou se um passante é possível; você não deve considerá-los na sua solução para o problema. Neste problema, uma posição é definida simplesmente pela configuração das peças no tabuleiro. Portanto, para os propósitos desse problema, duas posições são iguais, se cada quadrado em ambas as placas for ocupado pelo mesmo tipo de peça da mesma cor. Esta não precisa ser a peça exata, por exemplo, os cavaleiros brancos poderiam trocar quadrados e, se todas as outras peças atenderem aos critérios, essa ainda seria a mesma posição.
Como é uma notação válida?
Embora eu continue explicando a notação de coordenadas, você é livre para receber informações do sistema de notação que escolher. Providenciou que:
- Cada item da notação descreve um ou todos: a peça / peças envolvidas; se cheque, xeque-mate, duplo cheque, xeque-mate ou impasse foram entregues; se ocorreu uma captura passante; a posição inicial; a posição final.
- Você pode não ter informações sobre repetição em sua notação.
Portanto, desde que esses critérios sejam atendidos, fico feliz em aceitar, desde que você especifique em sua resposta, seu sistema de anotação. Pode ser, por exemplo, 0 linha indexada, tuplas de coluna ou o que fizer sentido para o seu programa.
Notação de coordenadas
A notação de coordenadas é uma notação que descreve puramente os movimentos como um sistema de coordenadas.
Uma movimentação é descrita como primeiro a coordenada inicial do conjunto {A1-H8}
e, em seguida, a coordenada de destino novamente do mesmo conjunto. Assim, o Gambit do rei se pareceria (como uma coleção de cordas)
{"E2-E4","E7-E5","F2-F4"}
Acredito que seja a melhor notação a ser usada para esse problema, pois não está repleta de informações estranhas, como se a verificação ocorreu ou qual é o tipo de peça em movimento. Conforme mencionado anteriormente, a notação pode ser de sua escolha; portanto, você pode usar outra notação, por exemplo, notação algébrica ou adaptar essa notação (por exemplo, remover os traços ou fazer uma lista de tuplas)
Regras:
- Você não deve considerar se uma posição ou movimento é válido, apenas se causa repetição
- Você pode supor que a promoção de castelos e peões não ocorrerá.
- Você deve ter uma lista de strings como entrada e saída de um valor de verdade ou falsey correspondente a se a terceira (ou mais) repetição ocorreu no movimento final
- O jogo sempre começa na posição inicial padrão do xadrez. A posição inicial pode contar para a repetição.
- O empate por repetição não ocorreu se a posição não for repetida pelo movimento final
Regras gerais:
- Isso é código-golfe , então a resposta mais curta em bytes vence.
Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação. - As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
- As brechas padrão são proibidas.
- Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
- Além disso, é altamente recomendável adicionar uma explicação para sua resposta.
Casos de teste
Você deve retornar valores de verdade para:
{"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 valores de falsey para:
{}
{"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
a posição inicial ocorreu três vezes.