Die Springsequenz

19

Definieren wir eine Sequenz. Wir werden sagen, dass die kleinste Zahl ist, , die die folgenden Eigenschaften hat:a(n)x

  • x und sind co-prime (sie teilen keinen Faktor)n

  • x erscheint nicht früher in der Sequenz

  • |nx|>1

Im Gegensatz zu den meisten Sequenzen sind die Domäne und der Bereich unserer Sequenz die ganzen Zahlen größer als 1.


Berechnen wir die ersten Begriffe.

a(2) muss mindestens 4 sein , aber 4 und 2 teilen sich einen Faktor von 2, so dass 5 sein muss .a(2)

a(3) muss mindestens 5 sein, aber 5 wird von , also ist es mindestens 6 , aber 6 teilt einen Faktor mit 3, also muss es mindestens 7 sein , 7 erfüllt alle drei Anforderungen, also .a(2)a(3)=7

a(4)

  • 2 Teilt einen Faktor
  • 3 Zu nah
  • 4 Zu nah
  • 5 Zu nah
  • 6 Teilt einen Faktor
  • 7 Aufgenommen von einem (3)
  • 8 Teilt einen Faktor
  • 9 ist gut

ein(5)

  • 2 ist gut

Aufgabe

In dieser Herausforderung müssen Sie ein Programm schreiben, das eine Zahl größer als 1 annimmt und ein(n) zurückgibt .

Dies ist eine Frage, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.

Testfälle

Hier sind die ersten paar Begriffe der Sequenz (Sie sind natürlich 2 indiziert):

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

Bonus Fun Tatsache

Wie von Robert Israel auf Math.se ( link ) bewiesen, ist diese Sequenz ihre eigene Inverse, dh ein(ein(n))=n für alle n.

OEIS

Nachdem ich diese Frage gestellt hatte, reichte ich diese Sequenz beim OEIS ein und nach ein paar Tagen wurde sie hinzugefügt.

OEIS A290151

Weizen-Assistent
quelle
Wie viele Werte haben Sie berechnet? (Apropos Bonus)
Socratic Phoenix
@SocraticPhoenix Ich habe es von Hand gemacht, also nur die in den Testfällen gezeigten. Ich debugge gerade ein Programm, um größere Werte zu überprüfen.
Weizen-Assistent
1
Wie bin ich ... es funktioniert momentan nicht, meine Indizierung ist deaktiviert (bearbeiten :) und jetzt funktioniert es ... die ersten 1000 sind sicher xD
Socratic Phoenix
Kennen Sie eine Obergrenze für a (x)? ZB a (x) <u * x für einige u. Übrigens sind die ersten paar Millionen Werte sicher.
Nimi
@nimi Ich kenne keine Obergrenze.
Weizen-Assistent

Antworten:

8

Haskell , 61 Bytes

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

Probieren Sie es online!

Ich bin ziemlich neu in Haskell, also sind alle Golftipps angebracht.

Danke an Wheat Wizard für 2 Bytes und nimi für 4 Bytes

Erläuterung:

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
quelle
2

Alice , 42 Bytes

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

Probieren Sie es online!

Erläuterung

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

Dies ist eine Standardvorlage für Programme, die eine Zahl als Eingabe und eine Zahl als Ausgabe verwenden. Diese Vorlage wurde geändert, um eine 1 auf dem Stapel unter der Eingabenummer zu platzieren.

Der Hauptteil des Programms platziert jede Nummer kim Slot a(k)auf dem Band. Die innere Schleife berechnet a (k) und die äußere Schleife iteriert über k, bis a (n) berechnet ist.

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
quelle
1

VB.NET (.NET 4.5), 222 Byte

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

Ich musste deine eigene GCD rollen. Ich konnte auch nicht herausfinden, wie ich es dazu bringen konnte, keine vollständige Funktion zu sein.

GCD ist immer> = 1, muss also nur 1 ignorieren

Kurzschließen im Golf herausgenommen, weil es kürzer ist

Nicht golfen

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
quelle
Ich kann es kaum fassen, dass in .NET kein GCD außerhalb der BigInteger-Klasse eingebaut ist.
Mego
1

Mathematica, 111 Bytes

(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]])&


Probieren Sie es online! 2..23 (Entfernungsmodus)

Probieren Sie es online! oder 150 (verschiedene Werte)

J42161217
quelle
0

05AB1E , 26 Bytes

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

n°T*10n10n

Erläuterung:

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
quelle