A083569: m ที่เล็กที่สุดที่ไม่ได้เกิดขึ้นก่อนหน้านี้ดังนั้น m + n จึงเป็นไพร์ม


26

กำหนดลำดับ 1 ที่จัดทำดัชนีดังนี้:

  • A083569(1) = 1
  • A083569(n)โดยที่nเป็นจำนวนเต็มมากกว่า1นั้นเป็นจำนวนเต็มที่น้อยที่สุด m ที่ไม่เกิดขึ้นก่อนหน้าเช่นที่m+nเป็นจำนวนเฉพาะ

งานของคุณคือการใช้เวลาในการและผลตอบแทนnA083569(n)

 n  A083569(n)
 1  1
 2  3
 3  2
 4  7
 5  6
 6  5
 7  4
 8  9
 9  8
10 13
11 12
12 11
13 10
14 15
15 14
16 21
17 20
18 19
19 18
20 17

testcases เพิ่มเติมสามารถพบได้ที่นี่ ลำดับเดิม OEIS สามารถพบได้ที่นี่

นี่คือรหัสกอล์ฟคำตอบที่สั้นที่สุดในการชนะไบต์ ช่องโหว่มาตรฐานใช้


@ Mr.Xcoder "กำหนดลำดับ 1 ดัชนีดังนี้"
Leaky Nun

คำตอบ:


14

Haskell , 87 86 83 80 74 69 ไบต์

ขอบคุณ xnor ที่แนะนำการเปลี่ยนแปลงบางอย่างที่บันทึกไว้ 3 ไบต์!

f n=[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]!!0

ลองออนไลน์!

ฉันใหม่สำหรับ Haskell และ Haskell golfing ข้อเสนอแนะได้รับการชื่นชม!

คำอธิบาย

f nเรากำหนดฟังก์ชั่น เรากำหนดf nให้เป็นองค์ประกอบแรก!!0ของรายการ:

[m|m<-[1..],all((>0).mod(n+m))[2..n+m-1],all((/=m).f)[1..n-1]]

พังทลายนั่นคือ:

[m|          # Numbers m
m<-[1..],    # From the integers greater than 0
all          # Forall x
(>0).mod(n+m)# n+m mod x is not zero
[2..n+m-1]   # from the integers from 2 to n+m-1
all          # Forall
((/=m).f)    # when f is applied the result is not m
[1..n-1]     # from the integers from 1 to n-1

3
ยินดีต้อนรับสู่ Haskell golfing! สิ่งที่[2,3..]สามารถทำได้[2..]คือการนับขึ้น 1 เป็นค่าเริ่มต้น มีในnotElemตัว
xnor

@xnor ขอบคุณ! ฉันลงเอยด้วยการหาวิธีที่ดีกว่าในการใช้notElemแต่เคล็ดลับแรกมีประโยชน์และฉันจะตรวจสอบให้แน่ใจว่าเก็บที่สองไว้ในกระเป๋าหลังของฉัน
ข้าวสาลีตัวช่วยสร้าง

ดูเหมือนว่าการแก้ไขใหม่ของคุณf 1ผิดควรเป็น 1
xnor

@xnor คงที่น่าเสียดายที่ราคา 3 ไบต์
ข้าวสาลีตัวช่วยสร้าง

6

เยลลี่ , 16 15 ไบต์

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ

สิ่งนี้ถือว่าA083569 (n) ≤n² (ลำดับดูเหมือนจะเพิ่มขึ้นแบบเส้นตรง)

ลองออนไลน์!

มันทำงานอย่างไร

Rɓ²R+⁸ÆPTḟḢṭµ/Ṫ  Main link. Argument: n

R                Range; yield [1, ..., n].
 ɓ               Begin a dyadic chain with swapped arguments.
            µ/   Reduce the range by that chain.
                 If we call the chain f, this computes f(2,1), then f(3,f(2,1)),
                 then f(4,f(3,f(2,1)), etc.
                 The left argument is an integer k, the right one an array A.
  ²                Square; yield k².
   R               Range; yield [1, ..., k²].
    +⁸             Add k, yielding [1+k, ..., k²+k].
      ÆP           Test each sum for primality.
        T          Truth; get all indices of 1‘s. This finds all m in [1, ..., k²]
                   such that m+k is prime.
         ḟ         Filterfalse; remove all resulting elements that appear in A.
          Ḣ        Head; extract the first remaining result.
           ṭ       Tack; append the extracted integer to A.
                 This computes the first n elements of the sequence.
              Ṫ  Tail; extract the last, n-th element.

4
อันที่จริงA083569(n)ที่มากที่สุดnวันที่สำคัญมีขนาดใหญ่กว่าnโดยความหมายของมันซึ่งเป็นที่มากที่สุด2nที่สำคัญวันที่ (สำหรับn≥3) น้อยกว่า4n*log(n)โดยผลของร็อส-Schoenfeld
Greg Martin

ในขณะที่การตรวจสอบ @GregMartin มันก็ยังคงเป็นสมมติฐานป่าสวยที่จะทำให้ ...
Esolanging ผลไม้

4
@ Challenger5 ฉันชอบ "การศึกษาเดา"
Dennis

6

Pyth - 18 17 15 ไบต์

ขอบคุณ @isaacg ที่ช่วยฉันสองไบต์!

กลับมาที่ไซต์นี้อีกครั้งหลังจากที่ไม่ว่างสักครู่หวังว่าจะได้เล่นกอล์ฟนี้ต่อไป

esmaYf&-TYP_+Th

ลองมันออนไลน์ได้ที่นี่


4
ยินดีต้อนรับกลับสู่ PPCG!
Leun Nun

@LeakyNun ขอบคุณ :)
Maltysen

1
-TYคือหนึ่งไบต์ที่สั้นกว่า!/YTและความจริงในกรณีเดียวกัน
isaacg

คุณสามารถบันทึกไบต์อื่นโดยการเปลี่ยนไป+hdT +Th
isaacg

@isaacg โอ้มันโยนองค์ประกอบแรกลงในรายการหรือไม่? มันเจ๋งจริงๆ
Maltysen

3

C # (. NET Core) 169 ไบต์

n=>{if(n<2)return 1;var p=new int[n-1];int i=0,j,s;for(;i<n-1;)p[i]=f(++i);for(i=1;;i++){for(j=2,s=i+n;j<s&&s%j++>0;);if(j==s&!System.Array.Exists(p,e=>e==i))return i;}}

ลองออนไลน์!

ไกลโดยวิธีที่ไม่มีประสิทธิภาพมากที่สุดในการคำนวณผลดังนั้นโปรดงดเว้นจากการคำนวณf(n)สำหรับn>=30ด้วยรหัสนี้ ขั้นตอนแรกคือการคำนวณค่าซ้ำ ๆ จากf(1)ถึงf(n-1)แล้วดำเนินการคำนวณต่อf(n)โดยค้นหาอันดับแรกiที่n+iไม่สำคัญและiไม่อยู่ในรายการค่าก่อนหน้า


3

x86-64 ชุดประกอบ, 57 55 ไบต์

ฉันใหม่กับการเล่นกอล์ฟดังนั้นความเห็น / ข้อเสนอแนะจะได้รับการชื่นชม

หมายเหตุ: สิ่งนี้ได้รับการปรับให้เหมาะสมกับความยาวรหัสเครื่องไม่ใช่สำหรับความยาวต้นฉบับ

0: 89 f8 ff cf 74 32 97 89 fe 89 f1 ff c6 89 f0 99
1: f7 f1 85 d2 e0 f7 85 c9 75 ed 89 f9 ff c9 56 29
2: fe 56 57 51 89 fc e8 d3 ff ff ff 59 5f 5e 39 c6
3: e0 ef 96 5e 74 d1 c3

กำหนดฟังก์ชั่นโดยใช้การประชุมมาตรฐาน (เช่นค่าส่งคืนใน eax อาร์กิวเมนต์แรกใน edi บันทึกการโทรทั้งหมดยกเว้นที่เรียกว่า ebx) ซึ่งใช้จำนวนเต็ม 32 บิตที่ไม่ได้ลงนามและส่งคืน m ที่เล็กที่สุดเป็นต้น

ที่มา:

    .globl a083569
    // edi = original, probably don't touch
    // esi = candidate prime, if it's not a repeat we return edi-this
a083569:
    mov %edi, %eax
    dec %edi
    jz end
    xchg %eax, %edi
    mov %edi, %esi
primecheck:
    mov %esi, %ecx
    inc %esi
primeloop:
    mov %esi, %eax
    cdq
    div %ecx
    test %edx, %edx
    loopnz primeloop
/* end */
    // if esi isn't prime, then ecx is now one or greater.
    test %ecx, %ecx
    jnz primecheck
    // esi is now our target prime: check if it's not already one
    mov %edi, %ecx
    dec %ecx
    push %rsi   /* we need a flag-safe way to restore this later */
    sub %edi, %esi
chkdup:
    push %rsi
    push %rdi
    push %rcx
    mov %ecx, %edi
    call a083569
    pop %rcx
    pop %rdi
    pop %rsi
    cmp %eax, %esi
    loopne chkdup
/* end loop - chkdup */
    xchg %esi, %eax
    pop %rsi
    je primecheck
/* end outer loop - primecheck */
end:
    ret

ลองออนไลน์!


1

Clojure, 158 155 ไบต์

#(loop[r[0 1]i 1](if(= i %)(last r)(recur(conj r(nth(for[j(range):when(=((set r)j)(seq(for[k(range 2(+ 1 i j)):when(=(mod(+ 1 i j)k)0)]j)))]j)0))(inc i))))

นี่อาจยังมีไขมันอยู่บ้างฉันไม่ค่อยพอใจเท่าไหร่(+ 1 i j)แต่นี่เป็นวิธีที่ง่ายที่สุดในการจัดการเคสพื้นฐานn = 1และที่เหลือ ((set r)j)ผลตอบแทนnilถ้าjไม่ได้อยู่ในชุดและ(seq ())ในรายการที่ว่างเปล่าส่งกลับศูนย์เช่นกัน คำนวณn = 1000ใน 48 วินาที

อัปเดต: นำออกnilจากการ=ตรวจสอบเนื่องจากรหัสทำงานอย่างถูกต้องและไม่มีรหัสดังกล่าว



1

Python, 194 170 110 ไบต์

84 ไบต์ถูกบันทึกโดย Leaky Nun

2 ไบต์บันทึกโดย mathmandan

def s(n):
 a=[s(j)for j in range(1,n)];i=1
 while(i in a)|any((i+n)%j<1for j in range(2,i+n)):i+=1
 return i

กำหนดฟังก์ชั่น s (n) ที่รับตัวเลขเป็นอินพุตและส่งกลับ A083569 (n)

ลองออนไลน์


1
คุณอาจลองใส่ลิงค์ TIOนี้
Leun Nun

1
คุณสามารถใช้p=lambda n:any(n%i<1for i in range(2,n))สำหรับการตรวจสอบเบื้องต้น
Leun Nun


1
คุณสามารถใช้ bitwise หรือบันทึกสองสามไบต์:while(i in a)|any(...
mathmandan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.