Sequência de Permutação em Espiral

17

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 nth 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 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 .

Martin Ender
fonte

Respostas:

6

Geléia, 11 10 bytes

’ƽð²+ḷ‘Ḥ_

Outra resposta da Jelly no meu telefone.

’ƽð²+ḷ‘Ḥ_   A monadic hook:
’ƽ          Helper link. Input: n
’             n-1
 ƽ            Atop integer square root. Call this m.
   ð         Start a new dyadic link. Inputs: m, n
    ²+ḷ‘Ḥ_    Main link:
    ²+ḷ       Square m, add it to itself,
       ‘      and add one.
        Ḥ     Double the result
         _    and subtract n.

Experimente aqui .

lirtosiast
fonte
Alguma dica para começar a usar o Jelly? Não sei dizer como os garfos / ganchos são analisados.
Lynn
Aprenda APL ou J primeiro. As cadeias são realmente mais fáceis do que trens, porque todas as funções têm aridade fixa.
lirtosiast
Entendo. Sim, eu tenho experiência em J. Suponho que tentarei ler jelly.pye descobrir quais cadeias são suportadas.
Lynn
2
Como diabos você digitou isso no seu telefone !? Isso é mais impressionante do que o próprio código!
DJMcMayhem
8

Japonês, 20 19 16 bytes

V=U¬c)²-V *2-U+2

Teste online!

Com base na observação de que

F (N) = teto (N ^ .5) * (teto (N ^ .5) -1) - N + 2

Ou melhor, isso

F (N) = o primeiro quadrado maior ou igual a N, menos sua raiz quadrada, menos N, mais 2.

Não sei se essa explicação está na página da OEIS, pois ainda não a examinei.

ETHproductions
fonte
5

Julia, 28 bytes

n->2((m=isqrt(n-1))^2+m+1)-n

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 2n -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

Alex A.
fonte
4

CJam, 14 bytes

qi_(mQ7Ybb2*\-

Usando a abordagem de Alex: 2*(m^2+m+1)-nonde m = isqrt(n-1).

Lynn
fonte
2

ES7, 31 28 26 bytes

n=>(m=--n**.5|0)*++m*2-~-n

Eu 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.

Neil
fonte
n=>((m=--n**.5|0)+m*m)*2-n+1funcionaria, eu acho.
ETHproductions
@ETHproductions Obrigado, eu estava me perguntando a mim mesmo como obter esse --naí ...
Neil
@ETHproductions Heh, consegui raspar 2 bytes da sua resposta.
Neil
1

Pitão, 21 bytes

K2-h+^.E@QKK^t.E@QKKQ

Experimente online!

Nada extravagante acontecendo. O mesmo método da resposta JAPT.

Denker
fonte
1

MATL , 16 13 bytes

qX^Y[tQ*Q2*G-

Baseado na resposta CJam de Lynn .

Experimente online! (Y[foi substituído porkalterações no idioma)

q       % input n. Subtract 1
X^      % square root
Y[      % floor
tQ      % duplicate and add 1
*       % multiply
Q       % add 1
2*      % multiply by 2
G-      % subtract n

Isso usa uma abordagem diferente das outras respostas ( 16 bytes ):

6Y3iQG2\+YLt!G=)

Ele gera explicitamente as duas matrizes espirais (na verdade, versões invertidas verticalmente delas, mas isso não afeta a saída). O primeiro é

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

e o segundo rastreia o caminho modificado:

25    10    11    12    13
24     9     2     3    14
23     8     1     4    15
22     7     6     5    16
21    20    19    18    17

Para encontrar o n-ésimo número da sequência, basta encontrar nna segunda matriz e escolher o número correspondente na primeira. As matrizes precisam ser grandes o suficiente para que napareçam e devem ter tamanho ímpar para que a origem (número 1) esteja na mesma posição em ambas.

Experimente online também! (6Y3foi movido de acordo com as mudanças no idioma)

6Y3      % 'spiral' string
i        % input n
QG2\+    % round up to an odd number large enough
YL       % generate spiral matrix of that size: first matrix
t!       % duplicate and transpose: second matrix
G=       % logical index that locates n in the second matrix
)        % use that index into first matrix
Luis Mendo
fonte
0

Braquilog , 20 bytes

-1$r$[I*I+I+1=*2-?=.

Isso usa a mesma técnica que praticamente todas as outras respostas.

Explicação

-1                   § Build the expression Input - 1
  $r                 § Square root of Input - 1
    $[I              § Unify I with the floor of this square root
       *I+I+1        § Build the expression I * I + I + 1
             =*2-?   § Evaluate the previous expression (say, M) and build the expression
                     § M * 2 - Input
                  =. § Unify the output with the evaluation of M * 2 - Input

Um fato interessante sobre essa resposta é que é mais fácil e mais curto de usar =do que parênteses.

Fatalizar
fonte