A083569: m terkecil tidak terjadi sebelumnya sehingga m + n adalah prima

26

Tetapkan urutan 1-diindeks sebagai berikut:

  • A083569(1) = 1
  • A083569(n)di mana nbilangan bulat lebih besar dari 1, adalah bilangan bulat terkecil m tidak terjadi sebelumnya sehingga m+nmerupakan bilangan prima.

Tugas Anda adalah menerima ndan mengembalikan A083569(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

Lebih banyak testcases dapat ditemukan di sini . Urutan asli pada OEIS dapat ditemukan di sini .

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.

Biarawati Bocor
sumber
@ Mr.Xcoder "Tetapkan urutan 1-diindeks sebagai berikut"
Leaky Nun

Jawaban:

14

Haskell , 87 86 83 80 74 69 byte

Terima kasih kepada xnor karena menyarankan beberapa perubahan yang menghemat 3 byte!

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

Cobalah online!

Saya baru mengenal Haskell, dan Haskell golf, umpan balik sangat dihargai!

Penjelasan

Kami mendefinisikan suatu fungsi f n. Kami menetapkan f nuntuk menjadi elemen pertama !!0dari daftar:

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

Rusak itu adalah:

[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
Wisaya Gandum
sumber
3
Selamat datang di golf Haskell! The [2,3..]saja bisa [2..], menghitung oleh 1 adalah default. Ada built-in notElem.
xnor
@ Terima kasih! Saya akhirnya menemukan cara yang lebih baik dalam menggunakan notElemtetapi tip pertama sangat membantu dan saya akan memastikan untuk menyimpan yang kedua di saku belakang saya.
Wheat Wizard
Sepertinya revisi baru Anda f 1salah, seharusnya 1.
xnor
@ xnor Tetap, sayangnya dengan biaya 3 byte.
Wheat Wizard
6

Jelly , 16 15 byte

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

Ini mengasumsikan A083569 (n) ≤ n² (urutannya tampaknya tumbuh secara linear).

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
4
Memang, A083569(n)paling tidak nbilangan prima lebih besar daripada nmenurut definisinya, yang paling banyak 2nbilangan prima, yang (untuk n≥3) kurang dari 4n*log(n)hasil Rosser-Schoenfeld.
Greg Martin
Sementara @GregMartin memverifikasinya, itu masih asumsi yang cukup liar untuk membuat ...
Esolanging Fruit
4
@ Challenger5 Saya lebih suka "tebakan berpendidikan".
Dennis
6

Pyth - 18 17 15 byte

Terima kasih kepada @isaacg karena telah menyelamatkan saya dua byte!

Kembali ke situs ini, setelah sibuk sebentar, semoga akan bermain golf lebih jauh.

esmaYf&-TYP_+Th

Cobalah online di sini .

Maltysen
sumber
4
Selamat datang kembali di PPCG!
Leaky Nun
@ LeakyNun Terima kasih :)
Maltysen
1
-TYlebih pendek satu byte dari !/YT, dan benar dalam kasus yang sama.
isaacg
Anda dapat menyimpan byte lain dengan mengubah +hdTke +Th.
isaacg
@isaacg, oh apakah itu memasukkan elemen pertama ke daftar? Itu keren sekali.
Maltysen
3

C # (.NET Core) , 169 byte

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;}}

Cobalah online!

Sejauh ini cara yang paling efisien untuk menghitung hasil, jadi mohon menahan diri dari perhitungan f(n)untuk n>=30dengan kode ini. Langkah pertama adalah menghitung secara rekursif nilai-nilai dari f(1)ke f(n-1)dan kemudian melanjutkan untuk menghitung f(n)dengan mencari yang pertama iseperti n+iprima dan itidak ada dalam daftar nilai sebelumnya.

Charlie
sumber
3

x86-64 Assembly, 57 55 byte

Saya baru mengenal golf, jadi komentar / umpan balik sangat dihargai.

Catatan: ini dioptimalkan untuk panjang kode mesin, bukan untuk panjang sumber.

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

Menentukan fungsi, menggunakan konvensi standar (yaitu nilai balik dalam eax, argumen pertama di edi, semua register yang disimpan kecuali penelepon ebx) yang mengambil bilangan bulat 32-bit yang tidak ditandatangani dan mengembalikan yang terkecil dll.

Sumber:

    .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

Cobalah online!

ObecessiousNewt
sumber
1

Clojure, 158 155 byte

#(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))))

Ini mungkin masih memiliki beberapa lemak, saya tidak cukup senang dengan (+ 1 i j)tetapi ini adalah cara termudah untuk menangani kasus dasar n = 1dan sisanya. ((set r)j)kembali niljika jtidak di set, dan (seq ())pada daftar kosong mengembalikan nihil juga. Menghitung n = 1000dalam 48 detik.

Pembaruan: dihapus nildari =cek karena kode berfungsi dengan benar juga tanpa itu.

NikoNyrh
sumber
1

Ruby , 62 + 8 = 70 byte

Menggunakan -rprimebendera.

f=->n,o=[]{o<<f[n-1,o]if n>1;Prime.find{|i|i>n&&o|[i-n]!=o}-n}

Cobalah online!

Nilai Tinta
sumber
1

Python, 194 170 110 byte

84 byte disimpan oleh Leaky Nun

2 byte disimpan oleh 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

Menentukan fungsi s (n) yang mengambil angka sebagai input dan mengembalikan A083569 (n).

Cobalah secara Online

Madison Silver
sumber
1
Anda dapat mempertimbangkan untuk menyertakan tautan TIO ini .
Leaky Nun
1
Anda dapat menggunakannya p=lambda n:any(n%i<1for i in range(2,n))untuk pemeriksaan awal.
Leaky Nun
1
110 byte
Leaky Nun
1
Anda dapat menggunakan bitwise atau untuk menyimpan beberapa byte:while(i in a)|any(...
mathmandan