Se pegarmos os números naturais e enrolá-los no sentido anti-horário em uma espiral, terminamos com a seguinte 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 um número nessa espiral, sua tarefa é determinar seus vizinhos - significando o elemento acima, esquerdo, direito e abaixo dele.
Exemplo
Se dermos uma olhada 27
, podemos ver que ele tem os seguintes vizinhos:
- acima:
28
- esquerda:
10
- certo:
52
- abaixo:
26
Portanto, a saída seria: [28,10,52,26]
Regras
- A entrada será um número em qualquer formato de E / S padrão
- A saída será uma lista / matriz / .. dos 4 vizinhos desses números em qualquer ordem (consistente!)
- Você pode trabalhar com uma espiral que começa com 1 em vez de 0, mas você deve especificar isso em sua resposta
Exemplos
A saída está no formato [above,left,right,below]
e usa uma espiral baseada em 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]
Respostas:
R , 156 bytes
Experimente online!
round
e usando,cospi(x)/sinpi(x)
que são mais precisos do quecos(x*pi)/sin(x*pi)
no caso de meio número (0.5
,1.5
etc ...)Explicação:
Se olharmos para as coordenadas da matriz dos valores, considerando o primeiro valor
0
colocado emx=0, y=0
, elas são:As
x
coordenadas seguem a sequência A174344 OEIS com a fórmula recursiva:A mesma fórmula vale para as
y
coordenadas da matriz, mas com emcos
vez desin
e negado:Assim, em R podemos traduzir a fórmula para esta função, tomando
sinpi/cospi
como parâmetro:e geramos os dois vetores de coordenadas (não negamos as cordas y, pois obteremos o mesmo resultado, apenas com os vizinhos para cima / para baixo invertidos):
Observe que geramos
(n+2)^2
coordenadas, que são mais do que as coordenadas mínimas necessárias que contêm ambosn
e seus vizinhos (um limite mais(floor(sqrt(n))+2)^2
estreito seria, mas infelizmente é menos "golfe").Portanto, agora que temos todas as coordenadas, primeiro pesquisamos as coordenadas
a,b
correspondentes a nossan
:finalmente, selecionamos as posições de seus vizinhos, ou seja:
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
usando:
fonte
Perl 6 ,
9483 bytes{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); mapa {primeiro: k, s [$ _] + $ ^ d, s}, i, -1,1, -i}Experimente online!
s
é uma lista preguiçosa e infinita de coordenadas em espiral, representada como números complexos. Ele é construído a partir de duas outras listas infinitas:1, *i ... *
faz a lista1, i, -1, -i ...
.1, 1.5 ... *
faz a lista1, 1.5, 2, 2.5, 3, 3.5 ...
. Fechando essas duas listas, juntamente com a replicação lista produz uma lista de passos de cada espiral de coordenadas para a próxima:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...
. (As partes fracionárias dos argumentos do lado direito do operador de replicação de lista são descartadas.) Fazer uma redução de adição triangular ([\+]
) nesta lista (e colar 0 na frente) produz a lista de coordenadas em espiral.Finalmente, a partir do número complexo
s[$_]
($_
sendo o único argumento para a função), olhamos para cima os índices (first :k
) na espiral dos números complexos, que são compensados a partir desse número pori
,-1
,1
, e-i
.fonte
Flacidez cerebral , 238 bytes
Experimente online!
A saída está na ordem esquerda, cima, direita, baixo.
Explicação
fonte
MATL , 15 bytes
Entrada e saída são baseadas em 1.
A saída mostra os vizinhos esquerdo, baixo, cima e direito nessa ordem.
Experimente online! Ou verifique todos os casos de teste, exceto os dois últimos, que atingem o tempo limite no TIO.
fonte
1YL
- MATLAB tem umaspiral
função? Quando o MATLAB se transformou no Mathematica ?!R , 172 bytes
Experimente online!
Este é R, então, obviamente, a resposta é indexada em 0.
A maior parte do trabalho está criando a matriz. Código inspirado em: https://rosettacode.org/wiki/Spiral_matrix#R
fonte
JavaScript (ES6), 165 bytes
Imprime os índices com
alert()
.Experimente online!
Quão?
(adaptado desta resposta de math.stackexchange)
fonte
RangeError: Maximum call stack size exceeded
e erro no console do navegador:InternalError: too much recursion
. Estou fazendo algo errado?Python 2 ,
177164146144 bytesExperimente online!
Calcula
u,l,r,d
diretamente den
.fonte
PHP (> = 5.4), 208 bytes
Para executá-lo:
Exemplo:
Ou Experimente online!
Notas:
-d error_reporting=0
opção é usada para não emitir avisos / avisos.Quão?
Estou gerando a espiral com uma versão modificada desta resposta em uma matriz bidimensional.
Eu decido o tamanho da espiral com base na entrada
n
com uma fórmula para obter sempre uma rodada extra de números na espiral (garantia de existência de acima / abaixo / esquerda / direita). Uma rodada extra de números significa+2
em altura e+2
largura da matriz bidimensional.Portanto, se
n
estiver localizado em uma espiral com tamanho máximo de3*3
, a espiral gerada será5*5
.O tamanho da espiral é
c*c
ondec = ceil(sqrt(n)) + k
, seceil(sqrt(n))
é ímpar, entãok
é 2 e seceil(sqrt(n))
é par, entãok
é 3.Por exemplo, a fórmula acima resultará neste:
n = 1
então, oc = 3
tamanho da espiral será3*3
n <= 9
então, oc = 5
tamanho da espiral será5*5
n <= 25
então, oc = 7
tamanho da espiral será7*7
n <= 49
então, oc = 9
tamanho da espiral será9*9
Enquanto que a produção da espiral, que armazenar o
x
ey
den
e após a geração, que os elementos de saída acima / abaixo de / para a esquerda / direita da mesma.fonte