Si tomamos los números naturales y los enrollamos en sentido antihorario en una espiral, terminamos con la siguiente espiral infinita:
....--57--56
|
36--35--34--33--32--31--30 55
| | |
37 16--15--14--13--12 29 54
| | | | |
38 17 4---3---2 11 28 53
| | | | | | |
39 18 5 0---1 10 27 52
| | | | | |
40 19 6---7---8---9 26 51
| | | |
41 20--21--22--23--24--25 50
| |
42--43--44--45--46--47--48--49
Dado un número en esa espiral, su tarea es determinar sus vecinos, es decir, el elemento arriba, izquierda, derecha y debajo de él.
Ejemplo
Si echamos un vistazo 27, podemos ver que tiene los siguientes vecinos:
- encima:
28 - izquierda:
10 - Derecha:
52 - abajo:
26
Entonces la salida sería: [28,10,52,26]
Reglas
- La entrada será un número en cualquier formato de E / S predeterminado
- La salida será una lista / matriz / ... de los 4 vecinos de esos números en cualquier orden (¡consistente!)
- Puede trabajar con una espiral que comienza con 1 en lugar de 0, sin embargo, debe especificar eso en su respuesta
Ejemplos
La salida está en el formato [above,left,right,below]y utiliza una espiral basada en 0:
0 -> [3,5,1,7]
1 -> [2,0,10,8]
2 -> [13,3,11,1]
3 -> [14,4,2,0]
6 -> [5,19,7,21]
16 -> [35,37,15,17]
25 -> [26,24,50,48]
27 -> [28,10,52,26]
73 -> [42,72,74,112]
101 -> [100,146,64,102]
2000 -> [1825,1999,2001,2183]
1000000 -> [1004003,1004005,999999,1000001]

Respuestas:
R , 156 bytes
Pruébalo en línea!
roundy usando,cospi(x)/sinpi(x)que son más precisos quecos(x*pi)/sin(x*pi)en el caso de números medios (0.5,1.5etc.)Explicacion:
Si observamos las coordenadas de la matriz de los valores, considerando el primer valor
0colocado enx=0, y=0, son:Las
xcoordenadas siguen la secuencia A174344 OEIS con la fórmula recursiva:La misma fórmula es válida para
ylas coordenadas de matriz, pero con encoslugar desiny negado:Entonces, en R podemos traducir la fórmula a esta función, tomando
sinpi/cospicomo parámetro:y generamos los dos vectores de coordenadas (no negamos las coordenadas y, ya que obtendremos el mismo resultado, solo con los vecinos arriba / abajo invertidos):
Tenga en cuenta que hemos generado
(n+2)^2coordenadas, que son más que las coordenadas mínimas necesarias que contienen a ambosny sus vecinos (un límite más estrecho sería,(floor(sqrt(n))+2)^2pero desafortunadamente es menos "golf").Por lo tanto, ahora que tenemos todas las coordenadas, primero buscamos las coordenadas
a,bcorrespondientes a nuestron:finalmente seleccionamos las posiciones de sus vecinos, es decir:
where x == a and y == b+1 or b-1where y == b and x == a+1 or a-1utilizando :
fuente
Perl 6 ,
9483 bytes{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); mapa {primero: k, s [$ _] + $ ^ d, s}, i, -1,1, -i}Pruébalo en línea!
ses una lista perezosa e infinita de coordenadas espirales, representada como números complejos. Está construido a partir de otras dos listas infinitas:1, *i ... *hace la lista1, i, -1, -i ....1, 1.5 ... *hace que la lista1, 1.5, 2, 2.5, 3, 3.5 .... Comprimir estas dos listas junto con la replicación lista produce la lista de pasos de cada espiral de coordenadas a la siguiente:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i .... (Las partes fraccionarias de los argumentos de la derecha para el operador de replicación de listas se descartan). Hacer una reducción de suma triangular ([\+]) en esta lista (y pegar 0 en el frente) produce la lista de coordenadas en espiral.Por último, a partir del número complejo
s[$_]($_siendo el único argumento de la función), miramos hacia arriba los índices (first :k) en la espiral de los números complejos que están desplazados de ese número pori,-1,1, y-i.fuente
Brain-Flak , 238 bytes
Pruébalo en línea!
La salida está en el orden izquierda, arriba, derecha, abajo.
Explicación
fuente
MATL , 15 bytes
La entrada y la salida están basadas en 1.
La salida muestra los vecinos izquierdo, inferior, superior y derecho en ese orden.
Pruébalo en línea! O verifique todos los casos de prueba, excepto los dos últimos, que caducan en TIO.
fuente
1YL- MATLAB tiene unaspiralfunción? ¿Cuándo MATLAB se convirtió en Mathematica?R , 172 bytes
Pruébalo en línea!
Esto es R, por lo que obviamente la respuesta está indexada en 0.
La mayor parte del trabajo es crear la matriz. Código inspirado en: https://rosettacode.org/wiki/Spiral_matrix#R
fuente
JavaScript (ES6), 165 bytes
Imprime los índices con
alert().Pruébalo en línea!
¿Cómo?
(adaptado de esta respuesta de math.stackexchange)
fuente
RangeError: Maximum call stack size exceededy el error en la consola del navegador:InternalError: too much recursion. ¿Estoy haciendo algo mal?Python 2 ,
177164146144 bytesPruébalo en línea!
Calcula
u,l,r,ddirectamente desden.fuente
PHP (> = 5.4), 208 bytes
Para ejecutarlo:
Ejemplo:
O Pruébelo en línea!
Notas:
-d error_reporting=0opción se utiliza para no generar avisos / advertencias.¿Cómo?
Estoy generando la espiral con una versión modificada de esta respuesta en una matriz de 2 dimensiones.
Decido el tamaño de la espiral en función de la entrada
ncon una fórmula para obtener siempre una ronda adicional de números en la espiral (garantía de existencia de arriba / abajo / izquierda / derecha). Una ronda adicional de números significa+2en altura y+2en ancho de la matriz bidimensional.Entonces, si
nse ubicará en una espiral con un tamaño máximo de3*3, entonces la espiral generada será5*5.El tamaño de la espiral es
c*cdondec = ceil(sqrt(n)) + k, siceil(sqrt(n))es impar, entonceskes 2 y siceil(sqrt(n))es par, entonceskes 3.Por ejemplo, la fórmula anterior dará como resultado esto:
n = 1entoncesc = 3y el tamaño en espiral será3*3n <= 9entoncesc = 5y el tamaño en espiral será5*5n <= 25entoncesc = 7y el tamaño en espiral será7*7n <= 49entoncesc = 9y el tamaño en espiral será9*9Mientras que la generación de la espiral, almaceno la
xyydeny después de la generación, la salida I los elementos anteriores / abajo / izquierda / derecha de la misma.fuente