Podemos acumular os números naturais em uma espiral retangular:
17--16--15--14--13
| |
18 5---4---3 12
| | | |
19 6 1---2 11
| | |
20 7---8---9--10
|
21--22--23--24--25
Mas agora que as temos em uma grade retangular, podemos desenrolar a espiral em uma ordem diferente, por exemplo, indo no sentido horário, começando no norte:
17 16--15--14--13
| | |
18 5 4---3 12
| | | | |
19 6 1 2 11
| | | |
20 7---8---9 10
| |
21--22--23--24--25
A sequência resultante é claramente uma permutação dos números naturais:
1, 4, 3, 2, 9, 8, 7, 6, 5, 16, 15, 14, 13, 12, 11, 10, 25, 24, 23, 22, 21, 20, 19, 18, 17, ...
Sua tarefa é calcular esta sequência. ( OEIS A020703 , mas aviso de spoiler: contém outra definição interessante e várias fórmulas que você pode querer descobrir).
Curiosidade: todos os 8 pedidos possíveis de desenrolamento têm sua própria entrada no OEIS.
O desafio
Dado um número inteiro positivo n
, retorne o n
th elemento da sequência acima.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Aplicam-se as regras de código-golfe padrão .
Casos de teste
1 1
2 4
3 3
4 2
5 9
6 8
7 7
8 6
9 5
100 82
111 111
633 669
1000 986
5000 4942
9802 10000
10000 9802
Para obter uma lista completa, incluindo n = 11131
o arquivo b no OEIS, inclusive .
fonte
jelly.py
e descobrir quais cadeias são suportadas.Japonês,
201916 bytesTeste online!
Com base na observação de que
Ou melhor, isso
Não sei se essa explicação está na página da OEIS, pois ainda não a examinei.
fonte
Julia, 28 bytes
Esta é uma função lambda que aceita um número inteiro e retorna um número inteiro. Para chamá-lo, atribua-o a uma variável.
Definimos m como o maior número inteiro, de modo que m 2 ≤ n -1, ou seja, a raiz quadrada inteira de n -1 (
isqrt
). Podemos então simplificar a expressão OEIS 2 ( m + 1) m - n + 2 para baixo para simplesmente 2 ( m 2 + m + 1) - n .Experimente online
fonte
CJam, 14 bytes
Usando a abordagem de Alex:
2*(m^2+m+1)-n
ondem = isqrt(n-1)
.fonte
ES7,
312826 bytesEu havia descoberto independentemente a fórmula de Alex, mas não posso provar porque não estava perto de um computador na época.
Editar: salvou 3 bytes em parte graças a @ETHproductions. Economizou mais 2 bytes.
fonte
n=>((m=--n**.5|0)+m*m)*2-n+1
funcionaria, eu acho.--n
aí ...Pitão, 21 bytes
Experimente online!
Nada extravagante acontecendo. O mesmo método da resposta JAPT.
fonte
MATL ,
1613 bytesBaseado na resposta CJam de Lynn .
Experimente online! (
Y[
foi substituído pork
alterações no idioma)Isso usa uma abordagem diferente das outras respostas ( 16 bytes ):
Ele gera explicitamente as duas matrizes espirais (na verdade, versões invertidas verticalmente delas, mas isso não afeta a saída). O primeiro é
e o segundo rastreia o caminho modificado:
Para encontrar o
n
-ésimo número da sequência, basta encontrarn
na segunda matriz e escolher o número correspondente na primeira. As matrizes precisam ser grandes o suficiente para quen
apareçam e devem ter tamanho ímpar para que a origem (número1
) esteja na mesma posição em ambas.Experimente online também! (
6Y3
foi movido de acordo com as mudanças no idioma)fonte
Braquilog , 20 bytes
Isso usa a mesma técnica que praticamente todas as outras respostas.
Explicação
Um fato interessante sobre essa resposta é que é mais fácil e mais curto de usar
=
do que parênteses.fonte