Este es el hoyo 3 del Torneo de otoño de APL CodeGolf . Soy el autor original del problema allí y, por lo tanto, me permite volver a publicarlo aquí.
Dado:
un número de turnos (indique si ningún movimiento es 0, de lo contrario asumiremos que se llama 1) y
una lista de una o más posiciones iniciales (en cualquier forma, por ejemplo, 0 o 1 coordenadas indexadas o 64 números / caracteres consecutivos o A1 – H8 - indica cuál), en un tablero de ajedrez de 8 por 8,
devolver (en cualquier orden) la lista de posiciones únicas (en el mismo formato que la entrada) en las que pueden estar los caballeros después del número dado de turnos.
Cada caballero debe moverse con cada turno, pero no tiene que preocuparse de que múltiples caballeros ocupen el mismo cuadrado.
Un caballero solo puede moverse a las posiciones marcadas con X en relación con su posición actual, marcadas con ♞:
Ejemplos (coordenadas indexadas 1)
1
pasar de [[1,1]]
: [[2,3],[3,2]]
2
se mueve desde [[1,1]]
: [[1,1],[1,3],[1,5],[2,4],[3,1],[3,5],[4,2],[4,4],[5,1],[5,3]]
1
pasar de [[1,1],[5,7]]
: [[2,3],[3,2],[3,6],[3,8],[4,5],[6,5],[7,6],[7,8]]
2
se mueve desde [[1,1],[5,7]]
: [[1,1],[1,3],[1,5],[1,7],[2,4],[2,6],[2,8],[3,1],[3,3],[3,5],[3,7],[4,2],[4,4],[4,6],[4,8],[5,1],[5,3],[5,5],[5,7],[6,4],[6,6],[6,8],[7,3],[7,7],[8,4],[8,6],[8,8]]
0
se mueve desde [[3,4]]
: [[3,4]]
fuente
[[1,1]], 2 -> [[2,3],[3,2]]
Respuestas:
Wolfram Language (Mathematica) , 45 bytes
Como la otra solución es incorrecta (vea el comentario de Martin a continuación), decido publicar mi solución:
Pruébalo en línea!
Notación de infijo definitiva ...
Toma 2 entradas, la primera es una lista de números dentro del rango que
[1,64]
describe las posiciones iniciales del caballero, la segunda es el número de pasos.Esta solución se basa en la extrema comodidad de las funciones incorporadas de Mathematica:
AdjacencyList
may toma una lista de vértices en su lado derecho y devuelve una lista de vértices adyacentes a cualquiera de ellos, ya eliminados, duplicados y ordenados .KnightTourGraph
Es un incorporado. No es sorpresaNest
toma los argumentos en ordenNest[f, expr, n]
, que podemos salpicar##
sobre su lado derecho comoNest[f, ##]
.a~b~c~d~e
como(a~b~c)~d~e
, por lo que no es necesario un corchete. Sin notación infija y aplanar##
, seríaNest[AdjacencyList[KnightTourGraph[8, 8], #] &, #, #2]&
.fuente
JavaScript (ES7), 99 bytes
Formato de entrada / salida: índices cuadrados en [0 ... 63] .
Casos de prueba
Este fragmento incluye dos funciones auxiliares para traducir desde y hacia el formato proporcionado por el OP.
Mostrar fragmento de código
¿Cómo?
Un movimiento de (x, y) a (X, Y) es un movimiento de caballero válido si tenemos:
Al cuadrar en lugar de usar valores absolutos, esto se puede expresar como:
Como 1 y 4 son los únicos cuadrados perfectos que dan 5 cuando se hacen XOR juntos, tenemos un movimiento válido de caballero si:
(xX) ² XOR (yY) ² XOR 5 = 0
Aplicamos esta fórmula a cada cuadrado p = 8y + x en el tablero y a cada cuadrado de caballero P = 8Y + X para deducir los nuevos cuadrados posibles de objetivo de caballero, y repetimos este proceso de manera recursiva n veces.
fuente
Octava, 69 bytes
Demo en línea!
La entrada / salida es la configuración de la placa al inicio / final como una matriz binaria 8 * 8.
Explicación:
Para los
n
pasos, repita la dilatación morfológica del tablero con la siguiente máscara:fuente
Retina ,
147102 bytesPruébalo en línea! Toma la entrada como una tabla de 8x8 de
:
s con los caballeros marcados conN
s, con un dígito para el número de vueltas en la siguiente línea (no tiene sentido tener más de 9 vueltas, pero si insiste, puedo apoyarlo por un extra byte). Tenga en cuenta que la salida contiene espacio en blanco adicional. Editar: Guardado 45 bytes gracias a @MartinEnder. Explicación: La primera etapa convierte el número de turnos a unario, pero usando caracteres de tabulación, para que no se emparejen más tarde por accidente, mientras que la segunda etapa agrega algunos espacios a la derecha del tablero para evitar que las expresiones regulares se envuelvan el borde. La tercera etapa reemplaza todosN
los:
sys que se alejan de un caballeroN
con unn
tiempo, mientras que la cuarta etapa elimina cualquierN
s restante , cambia eln
saN
s, y resta 1 del conteo de movimientos. Esto se repite hasta que el conteo de movimientos es cero.fuente
Jalea , 29 bytes
Pruébalo en línea!
Coordenadas indexadas a 0. Casi seguro que esto es subóptimo.
-1 byte gracias al usuario202729
Explicación
fuente
Ç
.05AB1E ,
2725 bytes¡Gracias a Emigna por guardar 2 bytes!
Utiliza coordenadas indexadas 1.
Código:
Utiliza la codificación 05AB1E . Pruébalo en línea!
Explicación:
Esto nos da la siguiente matriz:
Cuáles son los deltas de los movimientos del caballero.
fuente
•eĆ•SÍü‚
lugar deƵ‡4в2ô<D(«
guardar 2 bytes.Python 3, 105 bytes
Tiene que usar una lambda con nombre para la recursión. No estoy seguro si eso es descalificador. Pase en posiciones iniciales como lista de números cuadrados indexados a 0. 0 cuenta como sin movimientos.
fuente
Java (OpenJDK 8) , 124 bytes
Pruébalo en línea!
Formato de entrada / salida
La entrada / salida se representa como bits en a
long
(64 bits): los bits establecidos significan que hay un caballo, los bits no establecidos significan que no hay caballo. Ejemplo:Explicaciones
Créditos
(X-x)²+(Y-y)²==5
truco de la respuesta de JavaScript de Arnauldint[]
64 bitslong
.fuente
(m,p)->{for(;m-->0;){int i=64,a[]=p,x,y,u[]={1,3,5,9,15,19,21,23};for(p=new int[i];i-->0;)for(int z:u)if((((x=i/8+z/5-2)|(y=i%8+z%5-2))&-8)==0)p[x*8+y]|=a[i];}return p;}
(m,p)->{for(int i,j,a[],x;m-->0;)for(a=p,p=new int[i=64];i-->0;)for(j=64;j-->0;)p[j]|=(x=i%8-j%8)*x+(x=i/8-j/8)*x==5?a[i]:0;return p;}
int[]
conlong
:(m,p)->{for(long i,j,a;m-->0;)for(a=p,p=i=0;i<64;i++)for(j=64;j-->0;)p|=(p=i%8-j%8)*p+(p=i/8-j/8)*p==5?(a>>i&1)<<j:0;return p;}
Jalea ,
2928 bytesPruébalo en línea!
El número de turnos es a través de STDIN, y los cuadrados son un argumento.
Esto vincula la solución Jelly de @ HyperNeutrino, pero con un enfoque diferente.¡Ahora venciendo a @HyperNeutrino por 1 byte entero!
¡Se necesitan sugerencias para eliminar algunos bytes!
Enlace 1 (El tablero de ajedrez)
Enlace 2 (generación de movimiento)
Enlace 3 (verificación cuadrada)
fuente
Casco , 18 bytes
Utiliza la indexación basada en 1 de cuadrados y pasos. Pruébalo en línea!
Explicación
fuente
R ,
145183134 bytesEste es el resultado del excelente juego de golf de Giuseppe de mi algo inicial no demasiado golfista (vea el comentario a continuación)
Pruébalo en línea!
La entrada y la salida están basadas en 1 ... 64. Toma un vector de posición usando la notación 1 ... 64. Lo asigna a una notación de 1: 576, que es un súper tablero compuesto de nueve tableros. En esta notación, en cada iteración, cada caballero debería poder moverse en +/- 22,26,47,49 Devolver posiciones futuras de nuevo en la notación 1 ... 64, excluyendo aquellas que caen del tablero central. El ejemplo TIO muestra el resultado usando una matriz de 8x8.
fuente
[0...63]
notación en su lugar.[1..64]
para entrada y salida. +1, sin embargo, esta es una excelente respuesta.