Variabel Prime "Twins"


18

Saya kembar 2/3 dengan saudara laki-laki saya, yaitu lahir pada hari yang sama di bulan yang sama tetapi dua belas tahun kemudian. Ketika saya berusia 5 tahun, dia berusia 17 tahun, keduanya prima; pasangan usia terakhir yang bisa kita andalkan adalah [71, 83] dengan kita berdua masih hidup dan dapat merayakan Yobel kebetulan ini.

Tugas

Buat kode itu

  • mengambil dua bilangan bulat sebagai input: perbedaan antara penghitung dan "kembar" sebagai bilangan bulat positif k (ya, saya yang lebih muda) dan batas atas sebagai bilangan bulat positif u (pertimbangan runtime)

  • dan memberikan output sebagai array atau daftar semua angka i lebih rendah dari atau sama dengan u yang i dan i + k adalah bilangan prima. Output tidak perlu disortir.

Uji Kasus

12, 1000 -> [5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
2, 999 -> [3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
3, 1500 -> [2]
30, 1500 -> [7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]

Edit

Karena saya gagal menentukan batas atas, solusi inklusif dan eksklusif dipersilakan.

Edit No. 2

Tantangan berakhir pada 1 September, satu minggu dari awal.
Sepertinya kita memiliki pemenang tetapi jika popularitas dasi adalah pemutus dasi; dalam hal ini "yang kedua" akan dikompensasi melalui hadiah.


Jawaban:


5

Jelly, 8 7 byte

+ÆR©_f®

Cobalah online!

Penjelasan

+          add the upper bound and the difference
 ÆR        find all primes up to that number
   ©       save that in the register
    _      subtract the difference from each
     f®    remove anything not in the original prime list

Selamat @ Pietu1998!
user3819867

6

Brachylog , 27 23 byte

:1f
hS,?tye.:S+:.L*$pL,

Cobalah online!

Verifikasi semua testcases.

Predikat 0 (predikat utama)

:1f                     Find all solutions of predicate 1
                        given Input as Input,
                        Unify Output with the set of all solutions.

Predikat 1 (predikat bantu)

hS,?tye.:S+:.L*$pL,

hS                      the first element of Input is S,
   ?tye.                Output is an element between 0 and
                        the last element of Input,
       .:S+:.L          The list [Output+S,Output] is L,
             L*$pL      The product of L, prime-factorized, is still L



4

Oktaf, 34 33 byte

@(k,u)(a=primes(u))(isprime(a+k))

Pendekatan hebat! Itu memungkinkan saya untuk mengurangi dari 11 hingga 8 byte dalam jawaban saya
Luis Mendo

4

MATL , 8 byte

Kredit ke @alephalpha untuk pendekatannya , yang membantu saya menghemat 3 byte

Zqti+Zp)

Cobalah online!

Zq    % Take input implicitly. Vector of primes up to that. Call this vector A
ti+   % Duplicate, take second input, add element-wise. Call this vector B
Zp    % Vector containing true for prime numbers in B
)     % Use as an index into A. Display implicitly

4

Python 3, 114 92 90 byte

Berkat @ Dennis untuk -2 byte

def f(k,u):
 i=P=1;l={0}
 while i<u+k:l|={P%i*i};P*=i*i;i+=1
 return{i-k for i in l}&l-{0}

Fungsi yang mengambil input melalui argumen dan mengembalikan set yang tidak disortir. Ini eksklusif sehubungan dengan batas atas.

Ini menggunakan metode dalam jawaban xnor di sini untuk menemukan bilangan prima.

Cobalah di Ideone

Bagaimana itu bekerja

Temuan utama

Kami pertama-tama menginisialisasi nilai uji idan produk Psebagai 1, dan daftar bilangan prima lsebagai set berisi 0. Kemudian, whileloop yang menguji semua nilai idalam kisaran [1, u+k-1]untuk primality dieksekusi. Idenya adalah bahwa dengan mengalikan Pdengan i^2pada akhir setiap iterasi, Pmengambil nilai (i-1)!^2saat pengujian i, yaitu produk dari bilangan bulat [1, i+1]kuadrat. Tes primality aktual kemudian dilakukan dengan menghitung P mod i; jika ini mengembalikan nol, maka itidak dapat menjadi prima karena ini menyiratkan yang idapat dibagi oleh setidaknya satu dari nilai-nilai yang membentuk produk. Jika ini kembali 1, makaiharus prima karena tidak dapat dibagi oleh nilai apa pun dalam produk. Jika iprima, ditambahkan ke l, dan jika tidak, 0ditambahkan. Kuadrat produk mencegah identifikasi salah 4sebagai prima, dan berguna di sini karena menjamin bahwa hanya 0atau 1akan dikembalikan, memungkinkan pilihan nilai yang akan ditambahkan dibuat dengan hanya mengalikan hasilnya dengan i.

Identifikasi bilangan prima 'kembar'

Kami sekarang membuat set furter, berisi semua elemen l-k, elemen-bijaksana. Perpotongan set ini dan lkemudian ditemukan menggunakan &, yang meninggalkan set yang hanya berisi elemen-elemen yang umum untuk kedua set. Angka ihanya di kedua set jika keduanya idan i+kprima, artinya ini meninggalkan output yang diinginkan. Namun, jika kprima, 0akan hadir di kedua set, artinya ini harus dihapus sebelum kembali.


2
k,u=input();i=P=1;l={0};exec'l|={P%i*i};P*=i*i;i+=1;'*(u+k);print{i-k for i in l}&lbekerja untuk 83 byte dalam Python 2. Bahkan dalam 3, membangun satu set cara ini akan menghemat beberapa byte.
Dennis

@Dennis Terima kasih - ini memang menghemat beberapa byte dalam Python 3. Namun, saya memang harus menghapus 0dari set terakhir, karena jika kprima, ini keliru akan dikembalikan .
TheBikingViking

3

R, 98 byte

function(k,u){v=c();for(i in 1:u)if(sum(i%%(1:i)==0)==2&&sum((i+k)%%(1:(i+k))==0)==2){v=c(v,i)};v}

Tidak Disatukan:

function(k,u)
v=c()                                                    #Empty vector

for(i in 1:u)
    if(sum(i%%(1:i)==0)==2&&sum((i+k)%%(1:(i+k))==0)==2) #If both i and i+k only have 
                                                         #2 divisors such as the rest of the 
                                                         #euclidian division is 0 
                                                         #(i.e., they're both prime) :
        v=c(v,i)
v


2

Java 7, 185 175 byte

import java.util.*;List c(int k,int u){List l=new ArrayList();for(int i=1;++i<u;)if(p(i)&p(i+k))l.add(i);return l;}boolean p(int n){for(int i=2;i<n;)n=n%i++<1?0:n;return n>1;}

Tidak digabungkan & kode uji:

Coba di sini.

import java.util.*;
class M{
  static List c(int k, int u){
    List l = new ArrayList();
    for(int i = 1; ++i < u; ){
      if(p(i) & p(i+k)){
        l.add(i);
      }
    }
    return l;
  }

  static boolean p(int n){
    for(int i = 2; i < n; ){
      n = n % i++ < 1
           ? 0
           : n;
    }
    return n>1;
  }

  public static void main(String[] a){
    System.out.println(c(12, 1000));
    System.out.println(c(2, 999));
    System.out.println(c(3, 1500));
    System.out.println(c(30, 1500));
  }
}

Keluaran:

[5, 7, 11, 17, 19, 29, 31, 41, 47, 59, 61, 67, 71, 89, 97, 101, 127, 137, 139, 151, 167, 179, 181, 199, 211, 227, 229, 239, 251, 257, 269, 271, 281, 337, 347, 367, 389, 397, 409, 419, 421, 431, 449, 467, 479, 487, 491, 509, 557, 587, 601, 607, 619, 631, 641, 647, 661, 727, 739, 757, 761, 797, 809, 811, 827, 907, 929, 941, 971, 997]
[3, 5, 11, 17, 29, 41, 59, 71, 101, 107, 137, 149, 179, 191, 197, 227, 239, 269, 281, 311, 347, 419, 431, 461, 521, 569, 599, 617, 641, 659, 809, 821, 827, 857, 881]
[2]
[7, 11, 13, 17, 23, 29, 31, 37, 41, 43, 53, 59, 67, 71, 73, 79, 83, 97, 101, 107, 109, 127, 137, 149, 151, 163, 167, 181, 193, 197, 199, 211, 227, 233, 239, 241, 251, 263, 277, 281, 283, 307, 317, 337, 349, 353, 359, 367, 379, 389, 401, 409, 419, 431, 433, 449, 457, 461, 479, 491, 541, 547, 557, 563, 569, 571, 577, 587, 601, 613, 617, 631, 643, 647, 653, 661, 709, 727, 739, 743, 757, 797, 809, 823, 827, 829, 853, 857, 877, 881, 907, 911, 937, 941, 947, 953, 967, 983, 991, 1009, 1019, 1021, 1031, 1033, 1039, 1061, 1063, 1087, 1093, 1123, 1151, 1163, 1171, 1187, 1193, 1201, 1229, 1249, 1259, 1277, 1289, 1291, 1297, 1399, 1409, 1423, 1429, 1451, 1453, 1459, 1481, 1493]


2

Mathematica, 43 byte

(Prime@Range@PrimePi@#2+#)~Select~PrimeQ-#&

Hasilkan semua bilangan prima kurang dari atau sama dengan batas atas. Tambahkan perbedaan usia ke hasilnya. Pilih bilangan prima di antara mereka. Kurangi perbedaan usia dengan hasilnya.


2

Swift, 142 byte

func f(a:Int,b:Int)->Array<Int>{let p={(n:Int)->Int in([Int]()+(2..<n)).filter{n%$0<1}.count}
return([Int]()+(2...b)).filter{p($0)+p($0+a)<1}}

2

Perl 6 ,  39  37 byte

->\k,\u{grep {($_&$_+k).is-prime},2..u}
->\k,\u{grep {($_&$_+k).is-prime},^u}

Penjelasan:

-> \k, \u {

  # find all the values
  grep

  # where
  {
    # 「all」 junction of the two values
    ( $_   &   $_ + k ) # 「 all( $_, $_ + k ) 」

    # autothread a method call against the junction
    .is-prime
  },

  # from the values up to (and excluding) 「u」
  ^ u # short for 「 0 ..^ u 」
  # for inclusive use 「 2 .. u 」

}

2

SILOS , 205 byte

GOTO b
funce
n = p
p - 1
f = 1
lbla
f * p
f % n
p - 1
if p a
return
lblb
readIO 
s = i
readIO 
i - 2
lblc
i + 1
p = i
GOSUB e
F = f
p = i
p + s
GOSUB e
F * f
if F g
GOTO h
lblg
printInt i
lblh
i - 2
if i c

Cobalah online!

Tes Primalty oleh teorema Wilson .


1

Sebenarnya , 12 byte

Masukan ukemudian k. Saran bermain golf diterima. Cobalah online!

╖R`;p@╜+p*`░

Tidak melakukan pelanggaran:

╖              Store k in register 0.
 R             Range [1..u]
  `       `░   Start a function f and push values i of the range where f(i) is truthy.
   ;p@         Duplicate i, check if i is prime, and swap with the other i.
      ╜+p      Push k, add to i, check if i+k is prime.
         *     Multiply the two if results together.
                 Similar to logical AND. 1 if both are true, else 0.

1

R, 104 byte

Berbeda dengan solusi R lain yang diposting, yang ini mengambil input dari stdin.

s=scan();sapply(1:s[2],function(i){j=i+s[1];if((all(i%%(3:i-1)!=0)|i==2)&all(j%%(3:j-1)!=0))cat(i," ")})

Tidak Disatukan:

s=scan();        # Read from stdin
sapply(1:s[2],   # For i from 1 to u,
    function(i){     # apply this function:
        j=i+s[1];                # Define i+k
        if((all(i%%(3:i-1)!=0)   # Test if i is prime
           | i==2)               # (i is prime if i==2)
           & all(j%%(3:j-1)!=0)) # Test if i+k is prime
        cat(i," ")               # If i and i+k are prime, print i
    }
)

1

Javascript (ES6), 90 83 80 75 byte

(k,u)=>(r=n=>n++<u+k?r(P[P.every(i=>n%i)*n]=n):P.filter(n=>P[n+k]))(1,P=[])

Contoh:

let F =
(k,u)=>(r=n=>n++<u+k?r(P[P.every(i=>n%i)*n]=n):P.filter(n=>P[n+k]))(1,P=[])

console.log(F(2, 999))


1

Pyth, 13 byte

f&P_TP_+ThQSe

Program yang mengambil input dari daftar formulir [k, u]dan mencetak daftar.

Cobalah online

Bagaimana itu bekerja

f&P_TP_+ThQSe  Program. Input: Q
           Se  1-indexed range up to Q[1], yielding [1, 2, 3, ..., u]
f              Filter that, using variable T, by:
  P_T           T is prime
 &              and
     P_+ThQ     T+Q[0], i.e. T+k, is prime
               Implicitly print
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.