Нове замовлення №6: пасхальне яйце


13

Вступ (може бути проігноровано)

Розміщення всіх натуральних чисел у звичайному порядку (1, 2, 3, ...) трохи нудно, чи не так? Отже, ось низка викликів навколо перестановок (перестановок) усіх натуральних чисел. Це шостий виклик у цій серії (посилання на перший , другий , третій , четвертий та п’ятий виклики).

Цей виклик має м’яку великодню тему (адже це Великдень). Я взяв своє натхнення у цього дуже прикрашеного (і на мою особисту думку досить некрасивого) гусячого яйця.

Оздоблене гусяче яйце

Це нагадало мені спіраль Улама , де всі додатні цілі числа розміщені в спіралі проти годинникової стрілки. Ця спіраль має деякі цікаві особливості, пов’язані з простими числами, але це не актуально для цього завдання.

Улам спіраль

Ми переходимо до перестановки цього виклику додатних цілих чисел, якщо візьмемо числа у спіралі Улам і відстежимо всі цілі числа за спіраллю, що повертається за годинниковою стрілкою , починаючи з 1. Таким чином, ми отримуємо:

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

Якби ви намалювали обидві спіралі, ви отримаєте якусь нескінченну сітку (яєчної шкаралупи) спіралей ( зверніть увагу на посилання Нового порядку там ).

a(n)na(n)

Завдання

na(n)a(n)

a(0)=1;a(1)=6

Тестові справи

Input | Output
---------------
1     |  1
5     |  3
20    |  10
50    |  72
78    |  76
123   |  155
1234  |  1324
3000  |  2996
9999  |  9903
29890 |  29796

Правила

  • Вхід і вихід - цілі числа.
  • Ваша програма повинна хоча б підтримувати введення в межах від 1 до 32767).
  • Неправильний вхід (0, плавці, рядки, негативні значення тощо) може призвести до непередбачуваного виводу, помилок або (не) визначеної поведінки.
  • Застосовуються правила вводу / виводу за замовчуванням .
  • Бійниці за замовчуванням заборонені.
  • Це , тому найкоротші відповіді в байтах виграють

Відповіді:


12

Желе ,  16 14 11 10 9  8 байт

-1 завдяки Лінн (мод-2; логічне НЕ; додати до себе: Ḃ¬+-> побітовое АБО з 1: |1)

|1×r)ẎQi

Монадический Посилання приймає ціле число, n, що дає ціле число, a(n).

n2

½‘|1×rƲ€ẎQin+12

Як?

Перестановка полягає в тому, щоб прийняти натуральні числа у зворотних відрізках довжини [1,5,3,11,5,17,7,23,9,29,11,35,13,...]- непарні додатні цілі числа, перемежовані з натуральними числами, що збігаються з п’ятьма модулем шість, тобто [1, 2*3-1, 3, 4*3-1, 5, 6*3-1, 7, 8*3-1, 9, ...].

Це те саме, що об'єднуючи, а потім дедублювати зворотні діапазони, [1..x]де xє кумулятивні суми цих довжин зрізу (тобто максимум кожного зрізу) [1,6,9,20,25,42,49,72,81,110,121,156,169,...], - це непарні цілі числа, що перетинаються з парними числами, помноженими на самі нарощені, тобто [1*1, 2*3, 3*3, 4*5, 5*5, 6*7, 7*7,...].

Оскільки відмінності є більшими за 1, ми можемо зберегти байт (реверсування), будуючи діапазони [x..k]безпосередньо, де kє 1-індексований індекс фрагмента.

P(n)=vP(v)=nn|1×r)ẎQị@n|1×r)ẎQi

|1×r)ẎQi - Link: integer, n       e.g. 10
    )    - for each k in [1..n]:  vs = [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10]
|1       -   bitwise-OR (k) with 1     [ 1, 3, 3, 5, 5, 7, 7, 9, 9,11]
  ×      -   multiply (by k)           [ 1, 6, 9,20,25,42,49,72,81,110]
   r     -   inclusive range (to k)    [[1],[6..2],[9..3],[20..4],...,[110..10]]
     Ẏ   - tighten                     [1,6,5,4,3,2,9,8,7,6,5,4,3,20,...,4,......,110,...,10]
      Q  - de-duplicate                [1,6,5,4,3,2,9,8,7,20,...,10,......,110,...82]
       i - first index with value (n)  20

2
Дуже хороша. І ви перевершили відповідь MATL!
agtoever

1
Зв'язаний зараз ... :-)
Луїс Мендо

@LuisMendo Я щойно зрозумів, що тут можу зробити щось підлий і врятувати один байт :)
Джонатан Аллан

1
@JonathanAllan Aww. Це заслуговує на один підсумок :-)
Луїс Мендо

1
@Lynn Я фактично просто оновлююся до іншого 9 байтера. Ваші будуть робити 8!
Джонатан Аллан

6

JavaScript (ES7),  46 45  41 байт

0-індексований.

n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n

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

Як?

Це засновано на 1-індексованій формулі, використаній у прикладних програмах A090861 .

xn0

xn=n1+12

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

kn62

kn={2if n4xn2+2xn6otherwise

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

an

an=8xn2+knxn+2n

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

Що можна перекласти на:

n=>8*(x=(n-1)**.5+1>>1)*x+(n<=4*x*x+2*x?-2:6)*x+2-n

Здійснення 0-індексування економить 5 байт відразу:

n=>8*(x=n**.5+1>>1)*x+(n<4*x*x+2*x?-2:6)*x+1-n

Формулу можна додатково спростити, використовуючи:

xn=2×n+12

який може бути виражений як:

x=n**.5+1&~1

призводить до:

n=>2*(x=n**.5+1&~1)*x+(n<x*x+x?-1:3)*x+1-n

і, нарешті:

n=>((x=n**.5+1&~1)*2-(n<x*x+x)*4+3)*x+1-n




3

Python 3.8, 104 74 65 60 57 байт

lambda n:(-2,6)[n>4*(x:=(n**.5+1)//2)*x+2*x]*x+2+~n+8*x*x

Редагувати: Дякую Джонатану Аллану за те, що він отримав від 74 до 57 байт!

Це рішення використовує індексацію на основі 0.


1
Збережіть 39, уникаючи імпорту, видаляючи зайві дужки та використовуйте >замість <=і x*xзамість x**2... так: def f(n):x=((n-1)**.5+1)//2;return 8*x**2+(-2,6)[n>4*x*x+2*x]*x+2-n... TIO
Джонатан Аллан

Дивовижно! Я включу зміни. Внесла деякі зміни, перш ніж я побачила ваш коментар, і знизила його до 74 байт. Чи важливо, що ваші прибутки плавають? Я припускаю, що ні ...
Kapocsi

Поплавкові подання цілих чисел повинні бути добре. Збережіть ще кілька, використовуючи завдання Python 3.8 ... EDIT: зробіть це нульовим індексом
Джонатан Аллан

Дуже круто. Не соромтесь робити будь-які подальші зміни безпосередньо!
Капочі


2

Befunge, 67 57 байт

Це рішення передбачає індексацію на основі 0 для вхідних значень.

p&v-*8p00:+1g00:<
0:<@.-\+1*g00+*<|`
0g6*\`!8*2+00g4^>$:0

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

Пояснення

Почнемо з обчислення "радіуса", на якому вхід n знайдеться циклом:

radius = 0
while n > 0
  radius += 1
  n -= radius*8

В кінці циклу попереднє значення n - зміщення в спіраль на цьому радіусі:

offset = n + radius*8

Тоді ми можемо визначити, чи перебуваємо ми на верхній або нижній частині спіралі так:

bottom = offset >= radius*6

І як тільки ми отримаємо всі ці деталі, значення спіралі обчислюється з:

value = ((bottom?10:2) + 4*radius)*radius + 1 - offset

Радіус - єдине значення, яке нам потрібно зберігати як "змінну", обмежуючи його максимальним значенням 127 в Befunge-93, тому цей алгоритм може обробляти входи до 65024.


1

Japt , 15 байт

Розчин желейного порту Джонатана. 1-індексований.

gUòȲ+X*v)õÃcÔâ

Спробуй це

gUòȲ+X*v)õÃcÔâ     :Implicit input of integer U
g                   :Index into
 Uò                 :  Range [0,U]
   È                :  Map each X
    ²               :    Square X
     +X*            :    Add X multiplied by
        v           :    1 if X is divisible by 2, 0 otherwise
         )          :    Group result
          õ         :    Range [1,result]
           Ã        :  End map
            c       :  Flatten
             Ô      :    After reversing each
              â     :  Deduplicate

Я щойно сказав Джонатану, що x+(1-x%2)це x|1(збереження байта в Jelly), від чого ця відповідь також може отримати користь.
Лінн

0

C ++ (gcc) , 88 байт

#import<cmath>
int a(int n){int x=(sqrt(n-1)+1)/2;return x*(8*(x+(n>4*x*x+2*x))-2)+2-n;}

1-індексований; використовує формулу на сторінці OEIS, але маніпулює, щоб зберегти кілька байт.

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


Запропонувати sqrt(n-1)/2+.5замість(sqrt(n-1)+1)/2
roofcat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.