ลำดับการตีกลับ


19

ขอให้เรากำหนดลำดับ เราจะบอกว่าa(n)เป็นจำนวนที่น้อยที่สุดxซึ่งมีคุณสมบัติดังต่อไปนี้:

  • xและnเป็น co-prime (ไม่มีส่วนร่วม)

  • xไม่ปรากฏขึ้นก่อนหน้าในลำดับ

  • |n-x|>1

ซึ่งแตกต่างจากลำดับส่วนใหญ่โดเมนและช่วงของลำดับของเราเป็นจำนวนเต็มมากกว่า 1


ขอให้เราคำนวณคำศัพท์สองคำแรก

a(2)ต้องมีอย่างน้อย4แต่4และ2หุ้นปัจจัยของ2เพื่อ ( 2 )ต้องเป็น5a(2)

a(3)ต้องมีอย่างน้อย5แต่5ถูกใช้โดยa(2)ดังนั้นจึงเป็นอย่างน้อย6แต่6ใช้ปัจจัยร่วมกับ3ดังนั้นจะต้องมีอย่างน้อย7,7ตอบสนองความต้องการทั้งสามนี้ดังนั้นa(3)=7 7

a(4)

  • 2แบ่งปันปัจจัย
  • 3ใกล้เกินไป
  • 4ใกล้เกินไป
  • 5ใกล้เกินไป
  • 6แบ่งปันปัจจัย
  • 7ถ่ายโดย(3)
  • 8แบ่งปันปัจจัย
  • 9เป็นสิ่งที่ดี

a(5)

  • 2เป็นสิ่งที่ดี

งาน

ในความท้าทายนี้คุณอยู่ในการเขียนโปรแกรมที่ใช้เวลามากกว่าจำนวนกว่า 1 และส่งกลับ( n )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

โบนัสสนุกจริง

ดังที่ Robert Israel ระบุไว้ใน Math.se ( ลิงก์ ) ลำดับนี้เป็นค่าผกผันของตัวเองซึ่งหมายความว่าa(a(n))=nสำหรับ n ทั้งหมด

OEIS

หลังจากถามคำถามนี้ฉันส่งลำดับนี้ไปยัง OEIS และหลังจากนั้นสองสามวันมันก็ถูกเพิ่มเข้ามา

OEIS A290151


คุณคำนวณค่านิยมจำนวนเท่าใด (พูดถึงโบนัส)
Socratic Phoenix

@SocialPhoenix ฉันทำมันด้วยมือดังนั้นมีเพียงสิ่งที่แสดงในกรณีทดสอบ ขณะนี้ฉันกำลังดีบักโปรแกรมเพื่อตรวจสอบค่าที่มากขึ้น
ตัวช่วยสร้างข้าวสาลี

1
ในขณะที่ฉัน ... มันไม่ทำงานในขณะนี้การจัดทำดัชนีของฉันปิดอยู่ (แก้ไข :) และตอนนี้ก็ใช้งานได้ ... 1000 ตัวแรกปลอดภัย xD
Socratic Phoenix

คุณรู้ขอบเขตบนสำหรับ (x) หรือไม่? เช่น a (x) <u * x สำหรับบางคน Btw สองสามล้านค่าแรกนั้นปลอดภัย
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 เท่านั้น

นำไฟฟ้าลัดวงจรในสนามกอล์ฟเพราะมันสั้นกว่า

ยกเลิกแข็งแรงเล่นกอล์ฟ

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
Mego


1

Japt 33 ไบต์ (ไม่ใช่การแข่งขัน?)

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

ลองออนไลน์!

ฉันแก้ไขข้อผิดพลาดใน Japt Interpreterในขณะที่แก้ไขปัญหานี้ โพสต์เมตานี้ จากปีที่แล้วเห็นว่าคำตอบนี้ไม่ใช่การแข่งขัน แต่โพสต์เมตาที่ใหม่กว่านี้กำลังผลักดันให้มีอิสระมากขึ้นในเรื่องนี้ ไม่ว่าฉันจะใช้เวลามากไปกว่านี้ในการทำให้เป็นเรื่องที่สนใจ


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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.