Послідовність підстрибування


19

Давайте визначимо послідовність. Ми скажемо, що - найменше число, , яке має такі властивості:а(н)х

  • х і є спільними простими (вони не мають жодного фактора)н

  • х не відображається раніше в послідовності

  • |н-х|>1

На відміну від більшості послідовностей, домен і діапазон нашої послідовності є цілими числами більше 1.


Обчислимо першу пару доданків.

а(2) , має бути принаймні 4 , але 4 і 2 мають коефіцієнт 2, тому має бути 5 .а(2)

а(3) , має бути принаймні 5, але 5 приймається за , так що принаймні 6 , але 6 ділить коефіцієнт на 3, тому він повинен бути принаймні 7 , 7 відповідає всім трьом вимогам, таким чином .а(2)а(3)=7

а(4)

  • 2 Ділиться фактором
  • 3 Занадто близько
  • 4 Занадто близько
  • 5 Занадто близько
  • 6 Ділиться фактором
  • 7 Здійснено (3)
  • 8 Ділить фактор
  • 9 - це добре

а(5)

  • 2 добре

Завдання

У цьому виклику ви повинні написати програму, яка займає число більше 1 і повертає .а(н)

Це питання з тому відповіді будуть набиратись у байтах, менша кількість байтів - краща.

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

Ось перші пари послідовностей (вони, звичайно, 2 індексуються):

5,7,9,2,11,3,13,4,17,6,19,8,23,22,21,10,25,12,27,16,15,14

Факт бонусної забави

Як підтвердив Роберт Ізраїль на Math.se ( посилання ), ця послідовність є власною оберненою, це означає, що а(а(н))=н для всіх n.

OEIS

Задавши це запитання, я подав цю послідовність до ОЕІС і через кілька днів вона була додана.

OEIS A290151


Скільки значень ви обчислили? (Якщо говорити про премію)
Сократичний Фенікс

@SocratPhoenix Я робив це вручну, тому лише ті, що показані в тестових випадках. Зараз я налагоджую програму для перевірки великих значень.
Пшеничний майстер

1
Як і я ..., але зараз це не працює, моє індексування вимкнено (редагувати :), а зараз воно працює ... перші 1000 є безпечними xD
Socrat Phoenix

Чи знаєте ви верхню межу для (x)? Наприклад, a (x) <u * x для деяких u. Однак перші кілька мільйонів значень є безпечними.
німі

@nimi Я не знаю верхньої межі.
Пшеничний майстер

Відповіді:


8

Haskell , 61 байт

f n=[i|i<-[2..],gcd i n<2,all((/=i).f)[2..n-1],abs(n-i)>1]!!0

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

Я досить новачок у Haskell, тому будь-які поради з гольфу є улюбленими.

Завдяки Wheat Wizard за 2 байти та nimi за 4 байти

Пояснення:

f n=[i|i<-[2..],gcd i n<2,all((/=i).f)[2..n-1],abs(n-i)>1]!!0
f n=                                                          -- define a function f :: Int -> Int
    [i|i<-[2..],                                              -- out of positive integers greater than two
                gcd i n<2,                                    -- gcd of i and n is 1
                          all((/=i).f)[2..n-1],               -- i isn't already in the sequence
                                               abs(n-i)>1]    -- and |n-i| > 1
                                                          !!0 -- take the first element

2

Аліса , 42 байти

/oi
\1@/2-&whq&[]w].q-H.t*n$K.qG?*h$KW.!kq

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

Пояснення

/oi
\1@/.........

Це стандартний шаблон для програм, які приймають число як вхідне та виводять число, модифіковане для розміщення 1 на стеку нижче вхідного номера.

Основна частина програми розміщує кожен номер kу слоті a(k)на стрічці. Внутрішня петля обчислює a (k), а зовнішня петля перетворюється на k до тих пір, поки не буде обчислена a (n).

1       push 1
i       take input
2-&w    repeat n-1 times (push return address n-2 times)
h       increment current value of k
q&[     return tape to position 0
]       move right to position 1
w       push return address to start inner loop
]       move to next tape position
.q-     subtract tape position from k
H       absolute value
.t*     multiply by this amount minus 1
n$K     if zero (i.e., |k-x| = 0 or 1), return to start of inner loop
.qG     GCD(k, x)
?       current value of tape at position: -1 if x is available, or something positive otherwise
*       multiply
h$K     if not -1, return to start of inner loop
W       pop return address without jumping (end inner loop)
.!      store k at position a(k)
k       end outer loop
q       get tape position, which is a(n)
o       output
@       terminate

1

VB.NET (.NET 4.5), 222 байти

Function A(n)
Dim s=New List(Of Long)
For i=2To n
Dim c=2
While Math.Abs(i-c)<2Or g(c,i)>1Or s.Contains(c)
c+=1
End While
s.Add(c)
Next
Return s.Last
End Function
Function g(a, b)
Return If(b=0,a,g(b,a Mod b))
End Function

Мені довелося згортати ваш власний GCD. Я також не міг зрозуміти, як зробити так, щоб це не було цілою функцією.

GCD - це завжди> = 1, тому потрібно лише ігнорувати 1

У гольфі вийшло коротке замикання, оскільки воно коротше

Без гольфу

Function Answer(n As Integer) As Integer
    Dim seqeunce As New List(Of Integer)
    For i As Integer = 2 To n
        Dim counter As Integer = 2
        ' took out short-circuiting in the golf because it's shorter
        ' GCD is always >= 1, so only need to ignore 1
        While Math.Abs(i - counter) < 2 OrElse GCD(counter, i) > 1 OrElse seqeunce.Contains(counter)
            counter += 1
        End While
        seqeunce.Add(counter)
    Next
    Return seqeunce.Last
End Function

' roll your own GCD
Function GCD(a, b)
    Return If(b = 0, a, GCD(b, a Mod b))
End Function

Мені здається, що .NET не має вбудованого GCD поза класом BigInteger.
Мего


1

Japt , 33 байти (неконкуренто?)

ò2 rÈc_aY >1«XøZ «Yk øZk}a+2}[] o

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

Я виправив помилку в інтерпретаторі Japt , працюючи над цим рішенням. Цей мета-пост від року тому вважає цю відповідь неконкурентоспроможною, але ця нова мета-посада вимагає більшої свободи в цьому. Незважаючи на те, я витратив на це занадто багато часу, щоб його зламати.


0

05AB1E , 26 байт

2IŸεDU°2Ÿ¯KʒX¿}ʒXα1›}θDˆ}θ

Спробуйте в Інтернеті або виведіть першийнтерміни як список . (ПРИМІТКА: °очевидно надзвичайно повільно, тому замінено T*на посилання TIO (10н замість 10н).)

Пояснення:

2IŸ               # Create a list in the range [2, input]
   ε              # Map each value `y` to:
    DU            #  Store a copy of `y` in variable `X`
    °2Ÿ           #  Create a list in the range [10**`y`,2]
       ¯K         #  Remove all values already in the global_array
       ʒX¿}       #  Only keep values with a greatest common divider of 1 with `X`
       ʒXα1›}     #  Only keep values with an absolute difference larger than 1 with `X`
             θ    #  After these filters: keep the last (the smallest) element
              Dˆ  #  And add a copy of it to the global_array
                # After the map: only leave the last value
                  # (and output the result implicitly)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.