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"}
fonte
C6-B8
a posição inicial ocorreu três vezes.Respostas:
APL (Dyalog Extended) ,
5549474544 bytes SBCS-4 graças a ngn.
Programa completo. Solicita a lista invertida de pares de coordenadas invertidas:
por exemplo,
{"B1-C3","B8-C6"}
é[[[8,2],[6,3]],[[1,2],[3,3]]]
Experimente online! (inclui a função de utilitário
Coords
que traduz o formato do OP)Configure uma lista de estados:
s←3
atribuir a trêss
(para s stados)Como 3 não é um estado válido do quadro, não afetará nossa contagem de repetições, e precisamos do valor de passagem da tarefa…
Crie uma representação no tabuleiro de xadrez:
5
... descarte que para o resultado da aplicação da seguinte função derivada entre 5 e 3:⍥⍳
estender ambos os argumentos aos seus Ɩ ndices;[1,2,3,4,5]
…[1,2,3]
,∘⌽
O lado esquerdo concatenado com o reverso do lado direito[1,2,3,4,5,3,2,1]
representa os oficiais⍪
transformar em mesa;[[1],
[2],
[3],
[4],
[5],
[3],
[2],
[1]]
6,
prefixar (para cada linha) um seis, representando peões;[[6,1],
[6,2],
[6,3],
[6,4],
[6,5],
[6,3],
[6,2],
[6,1]]
⍉
transpor;[[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
¯4↑
tomar negativo (ou seja, o último) quatro (linhas), preenchendo com zeros, representando quadrados vazios;[[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
(
…)
Aplique a seguinte função tácita a isso:-
negar (isso representa a cor oposta);[[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-6,-6,-6,-6,-6,-6,-6,-6],
[-1,-2,-3,-4,-5,-3,-2,-1]]
⊖⍪
empilhe o argumento invertido em cima disso, dando-nos a pensão completa;[[ 1, 2, 3, 4, 5, 3, 2, 1],
[ 6, 6, 6, 6, 6, 6, 6, 6],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-6,-6,-6,-6,-6,-6,-6,-6],
[-1,-2,-3,-4,-5,-3,-2,-1]]
Construa uma lista de movimentos seguidos pelo estado inicial:
⊂
inclua que (para tratá-lo como uma única unidade)⎕,
solicitar a lista de movimentos e anexá-lo ao estado inicialReduza * por uma função que anexa o estado atual à lista e faz uma jogada:
{
…}/
Reduza pela seguinte lambda anônima:⍵
o argumento correto (o estado atual)⊂
coloque-o para tratá-lo como uma unidades,←
anexá-lo à lista de estados⊃
divulgá-lo para usar esse estado…
@⍺
Nos elementos com as duas coordenadas que o argumento esquerdo representa, coloque:0
um zero,
seguido∘
pelo⊃
primeiro valor,esse "move" efetivamente o valor na primeira coordenada para a segunda coordenada, deixando para trás um zero
Verifique se temos três ou mais do estado final:
s∩
a interseção de todos os estados com aquele final; o subconjunto de estados idênticos a ele≢
conte-os2≤
verifique se há dois ou mais (ou seja, três ou mais, incluindo o estado final)* APL é associativo à direita; portanto, primeiro a função é chamada com o estado inicial como argumento da direita e o movimento inicial como argumento da esquerda e, em seguida, seu resultado, o novo estado, torna-se o novo argumento da direita com o segundo movimento como novo argumento à esquerda etc. O resultado final é o
fonte
\
em vez de reduzir/
⍳3⊣s←⍬
->⍳s←3
. ele funciona porque3
não é uma placa válida por isso não irá afectar a detecção de repetição(0,⊃)@
->0,∘⊃@
R ,
180177144 bytesExperimente online!
-3 bytes graças a Giuseppe
-29 bytes graças ao uso de Nick Kennedy
Reduce
e-rev(l)
-4 bytes ao inverter
z
Toma como entrada um vetor de números inteiros entre 1 e 64, indicando os quadrados. O TIO inclui uma função para se transformar nesse formato. As diferentes partes são armazenadas como números inteiros entre 1 e 6 e entre -1 e -6.
Explicação:
fonte
Reduce
em sua essência. São 148 bytes.Geléia ,
4137 bytesExperimente online!
Um link monádico que recebe a entrada como uma lista de pares de movimentos principais da linha indexados em 1
[from, to]
e retorna um 1 para empates e 0 para não.Observe que o código do rodapé no TIO converte as movimentações fornecidas pelo OP para o formato numérico, mas, conforme a discussão abaixo da pergunta, o formato numérico teria sido uma entrada válida.
Explicação
fonte
JavaScript (Node.js) ,
121111 bytes[sq0, sq1]
Retorna um valor booleano.
Experimente online!
Quão?
Peças
Os valores usados para identificar as peças realmente não importam, desde que haja um valor único por tipo de peça.
Nós usamos:
Conselho e posição inicial
'89ABCA981111111'
→ as 8 peças principais pretas, seguidas pelos 7 primeiros peões pretos10n**32n
0x7e5196ee74377
→ todas as peças brancas (gasta2222222234567543
em decimal)o que resulta em:
Acompanhar as posições
É por isso que fazemos:
Comentado
fonte
Java 10,
336330287285282276 bytes-11 bytes graças a @Arnauld , alterando
i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0
parai%56<8?i%8*35%41%10%8+2:9>>i/16&1
.{"E2-E4",...
[[12,28],...
Experimente online.
Explicação:
Os valores das peças após preenchê-las
A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1)
são:Experimente online.
fonte
java.util.Arrays.deepHashCode(A)
, mas aparentemente alguns dos hashes ainda são os mesmos (por exemplo, o último caso de teste-447346111=3
no mapa ..) se eu comparar o mapa resultante da minha resposta atual e o mapa resultante usandodeepHashCode(A)
. Além disso, seriam 3 bytes a mais em vez de mais curtos, pois tenho que usardeepHashCode(A)
duas vezes (também para o estado inicial).two positions are seen to be the same if each square on both boards is occupied by the same type of piece of the same colour
i%8*35%41%10%8+2
deve ser uma possível substituição"ABCDECBA".charAt(i%8)
, economizando 6 bytes. Isso gera o padrão[ 2, 7, 3, 5, 9, 3, 7, 2 ]
.Carvão , 62 bytes
Experimente online! Link é a versão detalhada do código. Toma entrada como uma matriz de pares de números, onde os quadrados são numerados
A1
,B1
, ...H8
(0-indexada), de modo, por exemplo, o primeiro caso de teste seria representado como[[[1, 18], [57, 42], [18, 1], [42, 57], [1, 18], [57, 42], [18, 1], [42, 57]]]
e emite um-
, se a posição é uma tração por repetição. Programa de conversão. Tudo em um. Explicação:Divida o número
23456432
em dígitos individuais. Estes representam as peças brancas.Adicione os peões e as linhas vazias. Os peões brancos têm valor
1
e os peões pretos-1
.Anexe uma cópia negada das peças brancas, que representam as peças pretas.
Faça um loop sobre os movimentos.
Salve uma cópia do quadro. (Reversão é a maneira mais divertida de copiar o quadro.)
Atualize o destino com a peça de origem.
Retire a peça de origem.
Determine se a posição atual foi vista mais de uma vez antes.
fonte
C # (compilador interativo do Visual C #) , 204 bytes
Recebe a entrada como uma lista de tuplas de números inteiros, de onde o primeiro número inteiro é para onde se mover e o segundo é para onde se mover. 0 representa A1, 1 é A2 e 63 é H8.
Experimente online!
fonte
JDK (Java) ,
246245244 bytesExperimente online!
fonte