Problema:
En ajedrez, hay una regla algo bien conocida sobre el sorteo por repetición. Si la misma posición se repite 3 veces (o más), el jugador que intente hacer el movimiento que provocará esta repetición puede reclamar un empate.
A veces es una tarea fácil de detectar para un árbitro, si los últimos movimientos son solo los jugadores que se mueven hacia adelante y hacia atrás. A veces es menos trivial, cuando las piezas se han movido significativamente entre posiciones repetidas.
El problema en este desafío es generar un valor verdadero si la posición reclamada se dibuja por repetición (se ha visto 3 veces o más) y un valor falso si la posición reclamada no se dibuja por repetición, dada una lista de movimientos en notación coordinada como se describe a continuación, o cualquier anotación de su elección (pero tendrá que convertir los casos de prueba).
¿Qué es un puesto?
En un escenario del mundo real, la posición se vería afectada por cosas tales como si un jugador puede enrolar o si es posible pasarlo; usted debe no tener en cuenta estos en su solución al problema. En este problema, una posición se define simplemente por la configuración de las piezas en el tablero. Entonces, para los propósitos de este problema, se considera que dos posiciones son iguales si cada cuadrado en ambos tableros está ocupado por el mismo tipo de pieza del mismo color. Esta no tiene que ser la pieza exacta, por ejemplo, los caballeros blancos podrían intercambiar cuadrados y si todas las otras piezas cumplen los criterios, esta sería la misma posición.
¿Cómo se ve una notación válida?
Aunque continuaré explicando la notación coordinada, usted es libre de recibir información mediante el sistema de notación que elija. Siempre que:
- Cada elemento de la notación describe una o todas las partes involucradas; si se ha entregado cheque, jaque mate, doble cheque, jaque mate o estancamiento; si se ha producido una captura pasajera; la posición inicial La posición final.
- Es posible que no tenga información sobre la repetición en su notación.
Por lo tanto, siempre que se cumplan estos criterios, me complace aceptar, siempre y cuando especifique en su respuesta, su sistema de notación. Esto podría ser, por ejemplo, 0 filas indexadas, tuplas de columnas o lo que tenga sentido para su programa.
Notación coordinada
La notación coordinada es una notación que describe puramente los movimientos como un sistema de coordenadas.
Un movimiento se describe primero como la coordenada inicial del conjunto {A1-H8}
y luego la coordenada de destino nuevamente desde el mismo conjunto. Así se vería el Gambito del Rey (como una colección de cadenas)
{"E2-E4","E7-E5","F2-F4"}
Creo que es la mejor notación para usar en este problema porque no está llena de información extraña como si se ha producido un control o cuál es el tipo de movimiento de la pieza. Como se mencionó anteriormente, la notación puede ser de su elección, por lo que podría usar otra notación, por ejemplo, notación algebraica o podría adaptar esta notación (por ejemplo, eliminar los guiones o tomar como una lista de tuplas)
Reglas:
- Usted debe no considerar si una posición o movimiento es válido, solamente si causa la repetición
- Puede suponer que la promoción de castillos y peones no producirán .
- Debe tomar una lista de cadenas como entrada y salida de un valor verdadero o falso correspondiente a si la tercera (o más) repetición se produjo en el movimiento final
- El juego siempre comienza en la posición inicial estándar para el ajedrez. La posición inicial puede contar para la repetición.
- El sorteo por repetición no se ha producido si la posición no se repite en el movimiento final
Reglas generales:
- Este es el código de golf , por lo que la respuesta más corta en bytes gana.
No permita que los lenguajes de code-golf lo desanimen a publicar respuestas con lenguajes que no sean codegolfing. Trate de encontrar una respuesta lo más breve posible para 'cualquier' lenguaje de programación. - Las reglas estándar se aplican a su respuesta con las reglas de E / S predeterminadas , por lo que puede usar STDIN / STDOUT, funciones / método con los parámetros adecuados y programas completos de tipo retorno. Tu llamada.
- Lagunas predeterminadas están prohibidas.
- Si es posible, agregue un enlace con una prueba para su código (es decir, TIO ).
- Además, se recomienda agregar una explicación para su respuesta.
Casos de prueba
Debe devolver valores verdaderos 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"}
Y los 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"}
fuente
C6-B8
la posición inicial ha ocurrido tres veces.Respuestas:
APL (Dyalog Extended) ,
5549474544 bytes SBCS-4 gracias a ngn.
Programa completo Solicita una lista inversa de pares de coordenadas invertidas:
por ejemplo,
{"B1-C3","B8-C6"}
es[[[8,2],[6,3]],[[1,2],[3,3]]]
Pruébalo en línea! (incluye la función de utilidad
Coords
que traduce el formato de OP)Configure una lista de estados:
s←3
asignar tres as
(para s stados)Dado que 3 no es un estado de tablero válido, no afectará nuestro recuento de repeticiones, y necesitamos el valor de transferencia de la tarea ...
Construye una representación en el tablero de ajedrez:
5
… Descarte eso por el resultado de aplicar la siguiente función derivada entre 5 y 3:⍥⍳
extender ambos argumentos a sus ɩ ndices;[1,2,3,4,5]
...[1,2,3]
,∘⌽
el lado izquierdo concatenado con el reverso del lado derecho[1,2,3,4,5,3,2,1]
esto representa a los oficiales⍪
hacer en la mesa;[[1],
[2],
[3],
[4],
[5],
[3],
[2],
[1]]
6,
anteponer (a cada fila) un seis, que representa peones;[[6,1],
[6,2],
[6,3],
[6,4],
[6,5],
[6,3],
[6,2],
[6,1]]
⍉
transponer;[[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
¯4↑
tomar cuatro (filas) negativas (es decir, las últimas), rellenando con ceros, que representan cuadrados vacíos;[[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]]
(
…)
Aplica la siguiente función tácita a eso:-
negar (esto representa el color opuesto);[[ 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]]
⊖⍪
apile el argumento invertido encima de eso, dándonos la pensión 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]]
Construya una lista de movimientos seguidos del estado inicial:
⊂
adjunte eso (para tratarlo como una sola unidad)⎕,
solicite la lista de movimientos y añádala al estado inicialReduce * por una función que agrega el estado actual a la lista y realiza un movimiento:
{
…}/
Reducir por la siguiente lambda anónima:⍵
el argumento correcto (el estado actual)⊂
adjuntarlo para tratarlo como una unidads,←
en el lugar anexarlo a la lista de estados⊃
revelarlo para usar ese estado...
@⍺
a los elementos con las dos coordenadas que el argumento de la izquierda representa, puesto:0
un cero,
seguido∘
por⊃
el primer valorde manera eficaz "mueve" el valor de la primera coordenada a la segunda coordenada, dejando tras de sí un cero
Verifique si tenemos tres o más del estado final:
s∩
la intersección de todos los estados con ese último; el subconjunto de estados idénticos a él≢
contarlos2≤
comprobar si hay dos o más (es decir, tres o más, incluido el estado final)* APL es asociativo a la derecha, por lo que primero se llama a la función con el estado inicial como argumento derecho y el movimiento inicial como argumento izquierdo, y luego su resultado, el nuevo estado, se convierte en el nuevo argumento derecho con el segundo movimiento como nuevo argumento izquierdo , etc. El resultado final es el
fuente
\
lugar de reducir/
⍳3⊣s←⍬
->⍳s←3
. que funciona porque3
no es una tabla válida por lo que no afectará a la detección de la repetición(0,⊃)@
->0,∘⊃@
R ,
180177144 bytesPruébalo en línea!
-3 bytes gracias a Giuseppe
-29 bytes gracias al uso de Nick Kennedy de
Reduce
y-rev(l)
-4 bytes invirtiendo
z
Toma como entrada un vector de enteros entre 1 y 64 que denota los cuadrados. El TIO incluye una función para transformar en ese formato. Las diferentes piezas se almacenan como enteros entre 1 y 6 y entre -1 y -6.
Explicación:
fuente
Reduce
en su núcleo. Son 148 bytes.Jalea ,
4137 bytesPruébalo en línea!
Un enlace monádico que toma la entrada como una lista de pares de movimientos principales de fila indexados con 1
[from, to]
y devuelve un 1 para sorteos y 0 para no.Tenga en cuenta que el código de pie de página en TIO traduce los movimientos proporcionados por el OP al formato numérico, pero según la discusión debajo de la pregunta, el formato numérico habría sido una entrada válida.
Explicación
fuente
JavaScript (Node.js) ,
121111 bytes[sq0, sq1]
Devuelve un valor booleano.
Pruébalo en línea!
¿Cómo?
Piezas
Los valores utilizados para identificar las piezas realmente no importan siempre que haya un valor único por tipo de pieza.
Usamos:
Junta y posición inicial
'89ABCA981111111'
→ las 8 piezas principales negras, seguidas de los primeros 7 peones negros10n**32n
0x7e5196ee74377
→ todas las piezas blancas (se gasta2222222234567543
en decimal)lo que resulta en:
Hacer un seguimiento de las posiciones
Por eso hacemos:
Comentado
fuente
Java 10,
336330287285282276 bytes-11 bytes gracias a @Arnauld cambiando
i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0
ai%56<8?i%8*35%41%10%8+2:9>>i/16&1
.Ingrese como una matriz 2D de enteros dondeun 1 = 0 , b 1 = 1 , . . . , h 8 = 63 (
{"E2-E4",...
es decir, es[[12,28],...
).Pruébalo en línea.
Explicación:
Los valores de las piezas después de llenarlas
A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1)
son:Pruébalo en línea.
fuente
java.util.Arrays.deepHashCode(A)
, pero aparentemente algunos de los hashes siguen siendo los mismos de alguna manera (es decir, el último caso de prueba-447346111=3
en el mapa ...) si comparo el mapa resultante de mi respuesta actual y el mapa resultante usandodeepHashCode(A)
. Además, sería 3 bytes más largo en lugar de más corto, ya que tengo que usardeepHashCode(A)
dos veces (también para el 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
debería ser un posible reemplazo para"ABCDECBA".charAt(i%8)
ahorrar 6 bytes. Genera el patrón[ 2, 7, 3, 5, 9, 3, 7, 2 ]
.Carbón , 62 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Toma de entrada como una serie de pares de números donde se numeran los cuadrados
A1
,B1
, ...H8
(0-indexada) así por ejemplo, el primer caso de prueba se representa como[[[1, 18], [57, 42], [18, 1], [42, 57], [1, 18], [57, 42], [18, 1], [42, 57]]]
y emite una-
si la posición es un empate por repetición. Programa de conversión. Todo en uno. Explicación:Divide el número
23456432
en dígitos individuales. Estos representan las piezas blancas.Agregue los peones y las filas vacías. Los peones blancos tienen valor
1
y los peones negros-1
.Agregue una copia negada de las piezas blancas, que representan las piezas negras.
Recorre los movimientos.
Guarde una copia de la pizarra. (Revertir es la forma más elegante de copiar el tablero).
Actualice el destino con la pieza fuente.
Retire la pieza fuente.
Determine si la posición actual se vio más de una vez antes.
fuente
C # (compilador interactivo de Visual C #) , 204 bytes
Toma información como una lista de tuplas de enteros, donde el primer entero es desde dónde moverse, y el segundo es hacia dónde moverse. 0 representa A1, 1 es A2 y 63 es H8.
Pruébalo en línea!
fuente
Java (JDK) ,
246245244 bytesPruébalo en línea!
fuente