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


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

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

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

Ich kann es kaum fassen, dass in .NET kein GCD außerhalb der BigInteger-Klasse eingebaut ist.
Mego



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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.