Прыгающая последовательность


19

Давайте определим последовательность. Мы скажем, что - это наименьшее число , которое имеет следующие свойства:a(N)Икс

  • Икс и взаимно просты (они не имеют общего множителя)N

  • Икс не появляется раньше в последовательности

  • |N-Икс|>1

В отличие от большинства последовательностей домен и диапазон нашей последовательности являются целыми числами больше 1.


Давайте посчитаем первые пару терминов.

a(2) должно быть не менее 4 , но 4 и 2 имеют коэффициент 2, поэтому должно быть 5 .a(2)

a(3) должно быть не менее 5, но 5 взято , поэтому оно равно как минимум 6 , но 6 делит множитель с 3, поэтому оно должно быть не менее 7 , 7 удовлетворяет всем трем требованиям, таким образом, .a(2)a(3)знак равно7

a(4)

  • 2 Делит фактор
  • 3 Слишком близко
  • 4 Слишком близко
  • 5 Слишком близко
  • 6 Делит фактор
  • 7 Снято (3)
  • 8 Делит фактор
  • 9 это хорошо

a(5)

  • 2 это хорошо

задача

В этом задании вы должны написать программу, которая принимает число больше 1 и возвращает .a(N)

Это вопрос по поэтому ответы будут оцениваться в байтах, при этом меньшее количество байтов будет лучше.

Тестовые случаи

Вот первые пару членов последовательности (они, конечно, 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.a(a(N))знак равноN

OEIS

Задав этот вопрос, я отправил эту последовательность в OEIS, и через несколько дней она была добавлена.

OEIS A290151


Сколько значений вы вычислили? (Говоря о бонусе)
Сократов Феникс

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

1
Как и я ... сейчас это не работает, у меня индексирование отключено (правка :) и сейчас оно работает ... первые 1000 безопасны xD
Сократов Феникс

Вы знаете верхнюю границу для (х)? Например, a (x) <u * x для некоторых u. Кстати, первые несколько миллионов ценностей безопасны.
Nimi

@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

Устранено короткое замыкание в гольфе, потому что оно короче

Un-golfed

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ˆ}θ

N°T*10*N10N

Объяснение:

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.