Спіральна послідовність перестановки


17

Ми можемо згорнути натуральні числа у прямокутній спіралі:

 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

Але тепер, коли їх у нас на прямокутній сітці, ми можемо розмотувати спіраль у іншому порядку, наприклад, рухаючись за годинниковою стрілкою, починаючи на північ:

 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

Отримана послідовність явно є перестановкою натуральних чисел:

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

Ваше завдання - обчислити цю послідовність. ( OEIS A020703 , але попередження про спойлер: воно містить ще одне цікаве визначення та кілька формул, які ви, можливо, захочете розібратися самостійно.)

Веселий факт: усі 8 можливих замовлень на розмотування мають власну запис OEIS.

Змагання

Давши додатне ціле число n, поверніть nth елемент вищезазначеної послідовності.

Ви можете написати програму або функцію, взявши введення через STDIN (або найближчу альтернативу), аргумент командного рядка або аргумент функції та вивівши результат через STDOUT (або найближчу альтернативу), значення повернення функції або параметр функції (out).

Діють стандартні правила .

Випробування

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

Для повного списку до та включно n = 11131 див. B-файл на OEIS .

Відповіді:


6

Желе, 11 10 байт

’ƽð²+ḷ‘Ḥ_

Ще одна відповідь на мій телефон.

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

Спробуйте тут .


Якісь поради щодо початку роботи з Jelly? Я не можу сказати, як вилки / гачки розбираються взагалі.
Лінн

Вивчіть APL або J спочатку. Ланцюжки насправді простіші, ніж поїзди, тому що всі функції мають фіксовану сукупність.
lirtosiast

Я бачу. Так, у мене є досвід J. Я думаю, я спробую прочитати jelly.pyі з'ясувати, які ланцюги підтримуються.
Лінн

2
Як чорт ти це набрав на своєму телефоні !? Це більш вражаюче, ніж сам код!
DJMcMayhem

8

Japt, 20 19 16 байт

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

Перевірте це в Інтернеті!

Виходячи зі спостереження, що

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

Або, скоріше, що

F (N) = перший квадрат більший або рівний N, мінус його квадратний корінь, мінус N, плюс 2.

Я не знаю, чи є це пояснення на сторінці OEIS, оскільки я ще не розглядав його.


5

Джулія, 28 байт

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

Це лямбда-функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній.

Ми визначаємо m як найбільше ціле число, таке, що m 2n -1, тобто цілочисельний квадратний корінь n -1 ( isqrt). Тоді ми можемо спростити вираз OEIS 2 ( m + 1) m - n + 2 до просто 2 ( m 2 + m + 1) - n .

Спробуйте в Інтернеті


4

CJam, 14 байт

qi_(mQ7Ybb2*\-

Використання підходу Алекса: 2*(m^2+m+1)-nкуди m = isqrt(n-1).


2

ES7, 31 28 26 байт

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

Я самостійно виявив формулу Алекса, але не можу довести це, тому що я не був поруч з комп’ютером.

Редагувати: 3 байти збережено частково завдяки @ETHproductions. Збережено ще 2 байти.


n=>((m=--n**.5|0)+m*m)*2-n+1працював би, думаю.
ETHproductions

@ETHproductions Спасибі, мені було цікаво, як це зробити --nтам ...
Ніл

@ETHproductions Хе, мені вдалося поголити 2 байти з вашої відповіді.
Ніл


1

MATL , 16 13 байт

qX^Y[tQ*Q2*G-

На основі відповіді Лінн CJam .

Спробуйте в Інтернеті! (Y[заміненоkвідповідно до змін у мові)

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

Для цього використовується інший підхід, ніж інші відповіді ( 16 байт ):

6Y3iQG2\+YLt!G=)

Він явно генерує дві спіральні матриці (насправді вертикально перевернуті їх версії, але це не впливає на вихід). Перший - це

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

а другий простежує модифікований шлях:

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

Для знаходження n-го числа послідовності достатньо знайти nу другій матриці та вибрати перше число у першій. Матриці повинні бути достатньо великими, щоб вони nз'являлися, і мали мати непарний розмір, щоб походження (число 1) знаходилось в одному положенні в обох.

Спробуйте також онлайн ! (6Y3переміщено відповідно до змін у мові)

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

Брахілог , 20 байт

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

Для цього використовується та сама техніка, що і майже всі інші відповіді.

Пояснення

-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

Надзвичайно цікавий факт цієї відповіді полягає в тому, що використовувати її простіше і коротше =, ніж круглі дужки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.