Sequenza di permutazione a spirale


17

Possiamo arrotolare i numeri naturali in una spirale rettangolare:

 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

Ma ora che li abbiamo su una griglia rettangolare, possiamo svolgere la spirale in un ordine diverso, ad esempio andando in senso orario, iniziando da nord:

 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

La sequenza risultante è chiaramente una permutazione dei numeri naturali:

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

Il tuo compito è calcolare questa sequenza. ( OEIS A020703 , ma avvertimento spoiler: contiene un'altra definizione interessante e diverse formule che potresti voler capire da solo.)

Curiosità: tutti e 8 i possibili ordini di svolgimento hanno il proprio ingresso OEIS.

La sfida

Dato un numero intero positivo n, restituisce l' nelemento th della sequenza sopra.

È possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN (o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT (o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).

Si applicano le regole standard del .

Casi test

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

Per un elenco completo fino al e incluso, n = 11131 vedere il file b su OEIS .

Risposte:


6

Gelatina, 11 10 byte

’ƽð²+ḷ‘Ḥ_

Un'altra risposta di Jelly sul mio telefono.

’ƽð²+ḷ‘Ḥ_   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.

Provalo qui .


Qualche consiglio su come iniziare con Jelly? Non riesco a capire come vengano analizzate le forcelle / i ganci.
Lynn,

Impara prima APL o J. Le catene sono in realtà più facili dei treni perché tutte le funzioni hanno un'arità fissa.
Lirtosiast,

Vedo. Sì, ho esperienza J. Suppongo che proverò a leggere jelly.pye capire quali catene sono supportate.
Lynn,

2
Come diavolo l'hai digitato sul tuo telefono !? È più impressionante del codice stesso!
DJMcMayhem

8

Japt, 20 19 16 byte

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

Provalo online!

Sulla base dell'osservazione che

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

O meglio, quello

F (N) = primo quadrato maggiore o uguale a N, meno la sua radice quadrata, meno N, più 2.

Non so se questa spiegazione sia sulla pagina OEIS, poiché non l'ho ancora guardata.


5

Julia, 28 byte

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

Questa è una funzione lambda che accetta un numero intero e restituisce un numero intero. Per chiamarlo, assegnarlo a una variabile.

Definiamo m come intero più grande tale che m 2n -1, ovvero la radice quadrata intera di n -1 ( isqrt). Possiamo quindi semplificare l'espressione OEIS 2 ( m + 1) m - n + 2 semplicemente 2 ( m 2 + m + 1) - n .

Provalo online


4

CJam, 14 byte

qi_(mQ7Ybb2*\-

Utilizzando l'approccio di Alex: 2*(m^2+m+1)-ndove m = isqrt(n-1).


2

ES7, 31 28 26 byte

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

Avevo scoperto in modo indipendente la formula di Alex, ma non posso provarlo perché non ero vicino a un computer in quel momento.

Modifica: 3 byte salvati in parte grazie a @ETHproductions. Salvati altri 2 byte.


n=>((m=--n**.5|0)+m*m)*2-n+1funzionerebbe, penso.
ETHproductions

@ETHproductions Grazie, mi stavo chiedendo come farlo --ndentro ...
Neil,

@ETHproductions Heh, sono riuscito a radere 2 byte dalla tua risposta.
Neil,

1

Pyth, 21 byte

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

Provalo online!

Non sta succedendo niente di speciale. Stesso metodo della risposta JAPT.


1

MATL , 16 13 byte

qX^Y[tQ*Q2*G-

Basato sulla risposta CJam di Lynn .

Provalo online! (Y[è stato sostituito da inkbase alle modifiche nella lingua)

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

Questo utilizza un approccio diverso rispetto alle altre risposte ( 16 byte ):

6Y3iQG2\+YLt!G=)

Genera esplicitamente le due matrici a spirale (in realtà, versioni capovolte verticalmente di esse, ma ciò non influisce sull'output). Il primo è

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 il secondo traccia il percorso modificato:

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

Per trovare il nnumero esimo della sequenza è sufficiente trovare nnella seconda matrice e selezionare il numero corrispondente nella prima. Le matrici devono essere abbastanza grandi da napparire, e dovrebbero avere dimensioni dispari in modo che l'origine (numero 1) sia nella stessa posizione in entrambi.

Provalo anche online ! (6Y3è stato spostato in base alle modifiche nella lingua)

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

Brachylog , 20 byte

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

Questo utilizza la stessa tecnica di praticamente tutte le altre risposte.

Spiegazione

-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

Un fatto piuttosto interessante di questa risposta è che è più facile e più breve da usare =piuttosto che tra parentesi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.