Golf un programa o función que proporciona la ubicación del ñu que comienza en el cuadrado en un tablero de ajedrez infinito que está numerado en una espiral cuadrada en sentido antihorario, donde el ñu siempre visita el cuadrado con el número más bajo ella puede llegar a lo que aún no ha visitado.
Inspiración: The Trapped Knight y OEIS A316667 .
Editar: esta secuencia ahora está en el OEIS como A323763 .
El código puede producir la ubicación , las primeras ubicaciones, o generar la secuencia sin entrada.
Siéntase libre de darle su ubicación después (o hasta) saltos en su lugar, pero si es así, indíquelo claramente en su respuesta y asegúrese de que una entrada de rinda (o si corresponde).1
[1]
Este es el código de golf , por lo que el objetivo es producir código de trabajo en la menor cantidad de bytes posible en el idioma elegido.
Nota: el ñu queda atrapado (al igual que el caballero en su ubicación de , cuadrado , y el camello en su , cuadrado ) en su ubicación en el cuadrado . El comportamiento de su código puede ser indefinido para más grande que esto. (¡Gracias a Deadcode por el código C ++ que encontró esto!)
Detalle
El tablero se ve como el siguiente y continúa indefinidamente:
101 100 99 98 97 96 95 94 93 92 91
102 65 64 63 62 61 60 59 58 57 90
103 66 37 36 35 34 33 32 31 56 89
104 67 38 17 16 15 14 13 30 55 88
105 68 39 18 5 4 3 12 29 54 87
106 69 40 19 6 1 2 11 28 53 86
107 70 41 20 7 8 9 10 27 52 85
108 71 42 21 22 23 24 25 26 51 84
109 72 43 44 45 46 47 48 49 50 83
110 73 74 75 76 77 78 79 80 81 82
111 112 113 114 115 116 117 118 119 120 121
Un ñu es una pieza de ajedrez de hadas "gnu" , una pieza de ajedrez no estándar que puede moverse tanto como un caballero (un ) y como un camello (un ).
Como tal, podría mudarse a cualquiera de estos lugares desde su ubicación inicial de :( 1 , 3 ) 1
. . . . . . . . . . .
. . . . 35 . 33 . . . .
. . . . 16 . 14 . . . .
. . 39 18 . . . 12 29 . .
. . . . . (1) . . . . .
. . 41 20 . . . 10 27 . .
. . . . 22 . 24 . . . .
. . . . 45 . 47 . . . .
. . . . . . . . . . .
El más bajo de estos es y todavía no ha visitado ese cuadrado, por lo que es el segundo término de la secuencia.
A continuación, podría pasar de a cualquiera de estos lugares:
. . . . . . . . . . .
. . . . . . 14 . 30 . .
. . . . . . 3 . 29 . .
. . . . 6 1 . . . 53 86
. . . . . . . (10) . . .
. . . . 22 23 . . . 51 84
. . . . . . 47 . 49 . .
. . . . . . 78 . 80 . .
. . . . . . . . . . .
Sin embargo, ella ya visitó el cuadrado por lo que su tercera ubicación es el cuadrado , el más bajo que aún no ha visitado.
Los primeros términos del camino del ñu son:
1, 10, 3, 6, 9, 4, 7, 2, 5, 8, 11, 14, 18, 15, 12, 16, 19, 22, 41, 17, 33, 30, 34, 13, 27, 23, 20, 24, 44, 40, 21, 39, 36, 60, 31, 53, 26, 46, 25, 28, 32, 29, 51, 47, 75, 42, 45, 71, 74, 70, 38, 35, 59, 56, 86, 50, 78, 49, 52, 80, 83, 79, 115, 73, 107, 67, 64, 68, 37, 61, 93, 55, 58, 54, 84, 48, 76, 43, 69, 103, 63, 66, 62, 94, 57, 87, 125, 82, 118, 77, 113, 72, 106, 148, 65, 97, 137, 91, 129, 85
Los primeros saltos son movimientos de caballeros, por lo que los primeros términos coinciden con A316667 .
Respuestas:
JavaScript (Node.js) ,
191 ... 166164 bytesGuardado 2 bytes gracias a @grimy .
Devuelve el º plazo.N
Pruébalo en línea! o Ver una versión formateada
¿Cómo?
Índices espirales
Para convertir las coordenadas en el índice espiral , primero calculamos la capa con:(x,y) I L
Lo que da:
Luego calculamos la posición en la capa con:P
Lo que da:
El índice final viene dado por:I
NB: La fórmula anterior da una espiral indexada a 0.
En el código JS, en realidad calculamos inmediato con:4L2
Y luego reste con:P
Movimientos del ñu
Dada la posición actual , los 16 posibles cuadrados objetivo del ñu se prueban en el siguiente orden:(x,y)
Los recorremos aplicando 16 pares de valores con signo . Cada par está codificado como un solo carácter ASCII.(dx,dy)
Llevamos un registro del valor mínimo encontrado en de las coordenadas de la celda correspondiente en .m (H,V)
Una vez que se ha encontrado al mejor candidato, lo marcamos como visitado al establecer una bandera en el objeto , que también es nuestra función recursiva principal.g
En la primera iteración, comenzamos con e . Esto asegura que la primera celda seleccionada es y que es la primera celda que se marca como visitada.x=1 y=2 (0,0)
fuente
Buffer
para obligar a cada personaje a ser interpretado como un solo byte?Buffer
constructor aún acepta una cadena. Entonces, sí, esta es una forma bastante barata de convertirlo en una lista de bytes, en lugar de hacerlo[..."string"].map(c=>do_something_with(c.charCodeAt()))
.Coco ,
337276 bytesDevuelve un generador de valores. Probablemente podría jugar más golf. (Especialmente la secuencia de tuplas de diferencia.) Algoritmo espiral tomado de esta respuesta matemática .
Pruébalo en línea!
fuente
for a,b in (
->for a,b in(
(tal vez también puedas jugar a la tupla delta de las tuplas)q
y un zip es más corto para las tuplas: 306 bytes aún pueden ser golfables, por supuesto0.5
->.5
para otro byte guardar;A**2
->A*A
para uno más.05AB1E ,
7765585752 bytes-6 bytes gracias a @Arnauld utilizando un puerto de su fórmula.
Emite los primeros valores como una lista (de decimales).n+1
Pruébelo en línea (
ï
en el pie de página se elimina.0
para hacer que la salida sea más compacta, pero no dude en eliminarla para ver el resultado real).Explicación del código:
Explicación general:
Conservamos todos los resultados (y, por lo tanto, los valores que ya hemos encontrado) enx,y
global_array
, que inicialmente se inicia como[1]
.Mantenemos la actual coordenada en variable , que es inicialmente .
X
[0,0]
La lista de coordenadas que podemos alcanzar en base a la actual coordenada son:x,y
La lista que menciono en la explicación del código anterior contiene estos valores a los que podemos saltar, después de lo cual se agrega la actual (almacenada en la variable ).x,y
X
Luego calculará los valores espirales basados en estas coordenadas . Lo hace mediante el uso de la siguiente fórmula para una determinada coordenada :x,y x,y
Cuál es la misma fórmula que @Arnauld está usando en su respuesta , pero escrita de manera diferente para hacer uso de las incorporaciones de 05AB1E para doble, cuadrado, -1, +1, etc.
(Si desea ver solo esta parte espiral del código en acción: Pruébelo en línea ).
Después de obtener todos los valores que podemos alcanzar para la coordenada dada, eliminamos todos los valores que ya están presentes en el , y luego obtenemos el mínimo de los valores (restantes). Este mínimo se agrega a , y la variable se reemplaza con la coordenada de este mínimo.x,y x , y
x,y
global_array
global_array
X
Después de que hayamos enlazado la
input
cantidad de veces, el programa generará estoglobal_array
como resultado.fuente