Odskakująca sekwencja

19

Zdefiniujmy sekwencję. Powiemy, że za(n) jest najmniejszą liczbą, x , która ma następujące właściwości:

  • x in są pierwszorzędne (nie dzielą żadnego czynnika)

  • x nie pojawia się wcześniej w sekwencji

  • |n-x|>1

W przeciwieństwie do większości sekwencji domeną i zakresem naszej sekwencji są liczby całkowite większe niż 1.


Obliczmy pierwszą parę warunków.

za(2)) , musi wynosić co najmniej4, ale4i2mają współczynnik2,więcza(2)) musi wynosić5.

za(3)) , powinna wynosić co najmniej5a5zajmujeza(2)) , tak, że jest co najmniej6, a6udział jako czynnik3, tak więc musi być co najmniej7,7spełnia wszystkie trzy warunki tak ( 3 ) = 7za(3))=7 .

za(4)

  • 2 Udostępnia czynnik
  • 3 Za blisko
  • 4 Za blisko
  • 5 Za blisko
  • 6 Udostępnia czynnik
  • 7 Zrobione przez (3)
  • 8 Udostępnia czynnik
  • 9 jest dobra

za(5)

  • 2 jest dobre

Zadanie

W tym wyzwaniu masz napisać program, który przyjmuje liczbę większą niż 1 i zwraca za(n) .

To jest pytanie w więc odpowiedzi będą oceniane w bajtach, przy czym mniej bajtów będzie lepszych.

Przypadki testowe

Oto kilka pierwszych pojęć sekwencji (są one oczywiście indeksowane 2):

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

Dodatkowy fakt zabawy

Jak udowodnił Robert Israel na Math.se ( link ), ta sekwencja jest własną odwrotnością, co oznacza, że za(za(n))=n dla wszystkich n.

OEIS

Po zadaniu tego pytania przesłałem tę sekwencję do OEIS i po kilku dniach została dodana.

OEIS A290151

Kreator pszenicy
źródło
Ile wartości obliczyłeś? (Mówiąc o premii)
Socratic Phoenix
@SocraticPhoenix Robiłem to ręcznie, więc tylko te pokazane w testowych przypadkach. Obecnie debuguję program, aby sprawdzić większe wartości.
Wheat Wizard
1
Tak jak ja ... teraz nie działa, moje indeksowanie jest wyłączone (edytuj :) a teraz działa ... pierwsze 1000 jest bezpieczne xD
Socratic Phoenix
Czy znasz górną granicę dla (x)? Np. A (x) <u * x dla niektórych u. Btw pierwsze kilka milionów wartości jest bezpieczne.
nimi
@nimi Nie wiem o górnej granicy.
Wheat Wizard

Odpowiedzi:

8

Haskell , 61 bajtów

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

Wypróbuj online!

Jestem całkiem nowy w Haskell, więc wszelkie wskazówki dotyczące golfa są odpowiednie.

Dzięki Wheat Wizard za 2 bajty i nimi za 4 bajty

Wyjaśnienie:

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
Mego
źródło
2

Alice , 42 bajty

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

Wypróbuj online!

Wyjaśnienie

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

Jest to standardowy szablon dla programów, które przyjmują liczbę jako dane wejściowe i wyprowadzają liczbę, zmodyfikowaną tak, aby umieścić 1 na stosie poniżej liczby wejściowej.

Główna część programu umieszcza każdy numer kw gnieździe a(k)na taśmie. Wewnętrzna pętla oblicza a (k), a zewnętrzna pętla iteruje ponad k, aż zostanie obliczone 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
Nitrodon
źródło
1

VB.NET (.NET 4.5), 222 bajty

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

Musiałem zrobić własny GCD. Nie mogłem też wymyślić, jak sprawić, by nie była to cała funkcja.

GCD jest zawsze> = 1, więc wystarczy zignorować 1

Zwrócił uwagę na zwarcie w golfie, ponieważ jest krótszy

Nie grał w golfa

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
Brian J.
źródło
Przychodzi mi do głowy, że .NET nie ma wbudowanego GCD poza klasą BigInteger.
Mego
1

Mathematica, 111 bajtów

(s={};Table[m=2;While[m<3#,If[CoprimeQ[i,m]&&FreeQ[s,m]&&Abs[i-m]>1,s~AppendTo~m;m=3#];m++],{i,2,#}];s[[#-1]])&


Wypróbuj online! 2..23 (tryb zasięgu)

Wypróbuj online! lub 150 (różne wartości)

J42161217
źródło
0

05AB1E , 26 bajtów

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

Wypróbuj online lub wydrukuj pierwszynwarunki jako lista . (UWAGA: °jest oczywiście bardzo powolny, dlatego zastąpiono T*go linkami TIO (10n zamiast 10n).)

Wyjaśnienie:

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)
Kevin Cruijssen
źródło