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!
round
y 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.5
etc.)Explicacion:
Si observamos las coordenadas de la matriz de los valores, considerando el primer valor
0
colocado enx=0, y=0
, son:Las
x
coordenadas siguen la secuencia A174344 OEIS con la fórmula recursiva:La misma fórmula es válida para
y
las coordenadas de matriz, pero con encos
lugar desin
y negado:Entonces, en R podemos traducir la fórmula a esta función, tomando
sinpi/cospi
como 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)^2
coordenadas, que son más que las coordenadas mínimas necesarias que contienen a ambosn
y sus vecinos (un límite más estrecho sería,(floor(sqrt(n))+2)^2
pero desafortunadamente es menos "golf").Por lo tanto, ahora que tenemos todas las coordenadas, primero buscamos las coordenadas
a,b
correspondientes a nuestron
:finalmente seleccionamos las posiciones de sus vecinos, es decir:
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
utilizando :
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!
s
es 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 unaspiral
funció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 exceeded
y 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,d
directamente desden
.fuente
PHP (> = 5.4), 208 bytes
Para ejecutarlo:
Ejemplo:
O Pruébelo en línea!
Notas:
-d error_reporting=0
opció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
n
con 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+2
en altura y+2
en ancho de la matriz bidimensional.Entonces, si
n
se 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*c
dondec = ceil(sqrt(n)) + k
, siceil(sqrt(n))
es impar, entoncesk
es 2 y siceil(sqrt(n))
es par, entoncesk
es 3.Por ejemplo, la fórmula anterior dará como resultado esto:
n = 1
entoncesc = 3
y el tamaño en espiral será3*3
n <= 9
entoncesc = 5
y el tamaño en espiral será5*5
n <= 25
entoncesc = 7
y el tamaño en espiral será7*7
n <= 49
entoncesc = 9
y el tamaño en espiral será9*9
Mientras que la generación de la espiral, almaceno la
x
yy
den
y después de la generación, la salida I los elementos anteriores / abajo / izquierda / derecha de la misma.fuente