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 .

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 .


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.


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


4

CJam, 14 bytes

qi_(mQ7Ybb2*\-

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


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.


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

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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.