Biến tướng Prime Twins


18

Tôi là 2/3 cặp song sinh với anh trai tôi, tức là sinh cùng ngày cùng tháng nhưng mười hai năm sau. Khi tôi lên 5, anh ấy 17 tuổi, cả hai số nguyên tố; cặp tuổi cuối cùng mà chúng ta có thể tin cậy một cách hợp lý là [71, 83] với cả hai chúng ta đều còn sống và có thể ăn mừng lễ kỷ niệm tình cờ này.

Bài tập

Tạo một mã

  • lấy hai số nguyên làm đầu vào: sự khác biệt giữa bộ đếm và "sinh đôi" làm số nguyên dương k (vâng, tôi là người trẻ hơn) và giới hạn trên là số nguyên dương u (xem xét thời gian chạy)

  • và đưa ra đầu ra dưới dạng một mảng hoặc danh sách của tất cả các số i thấp hơn hoặc bằng u mà cả ii + k đều là số nguyên tố. Đầu ra không cần phải được sắp xếp.

Các trường hợp thử nghiệm

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]

Biên tập

Vì tôi không thể chỉ định giới hạn trên, cả hai giải pháp bao gồm và độc quyền đều được chào đón.

Chỉnh sửa số 2

Thử thách kết thúc vào ngày 1 tháng 9, một tuần kể từ khi bắt đầu.
Có vẻ như chúng ta có một người chiến thắng nhưng trong trường hợp phổ biến cà vạt là người phá vỡ cà vạt; trong trường hợp này, "thứ hai" sẽ được bồi thường thông qua tiền thưởng.


Câu trả lời:


5

Thạch, 8 7 byte

+ÆR©_f®

Hãy thử trực tuyến!

Giải trình

+          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

Xin chúc mừng @ Pietu1998!
user3819867

6

Brachylog , 27 23 byte

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

Hãy thử trực tuyến!

Xác nhận tất cả các testcase.

Vị ngữ 0 (vị ngữ chính)

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

Vị ngữ 1 (vị ngữ phụ)

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

Octave, 34 33 byte

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

Cách tiếp cận tuyệt vời! Nó cho phép tôi giảm từ 11 đến 8 byte trong câu trả lời của mình
Luis Mendo

4

MATL , 8 byte

Tín dụng cho @alephalpha cho cách tiếp cận của anh ấy , giúp tôi tiết kiệm 3 byte

Zqti+Zp)

Hãy thử trực tuyến!

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

Cảm ơn @Dennis cho -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}

Một hàm nhận đầu vào thông qua đối số và trả về một tập hợp chưa được sắp xếp. Điều này là độc quyền đối với giới hạn trên.

Điều này sử dụng phương pháp trong câu trả lời của @ xnor tại đây để tìm các số nguyên tố.

Hãy thử nó trên Ideone

Làm thế nào nó hoạt động

Tìm kiếm chính

Đầu tiên chúng ta khởi tạo một giá trị kiểm tra ivà một sản phẩm Pnhư 1, và một danh sách các số nguyên tố llà tập chứa 0. Sau đó, một whilevòng lặp kiểm tra tất cả các giá trị itrong phạm vi [1, u+k-1]cho tính nguyên thủy được thực thi. Ý tưởng là bằng cách nhân Pvới i^2vào cuối mỗi lần lặp, Plấy giá trị (i-1)!^2trong khi kiểm tra i, tức là tích của các số nguyên [1, i+1]bình phương. Kiểm tra tính nguyên thủy thực tế sau đó được thực hiện bằng cách tính toán P mod i; nếu giá trị này trả về 0, thì ikhông thể là số nguyên tố vì điều này có nghĩa ilà chia hết cho ít nhất một trong các giá trị tạo nên sản phẩm. Nếu điều này trở lại 1, thìiphải là số nguyên tố vì nó không chia hết cho bất kỳ giá trị nào trong sản phẩm. Nếu ilà số nguyên tố, nó được nối vào lvà nếu không, 0sẽ được nối thêm. Bình phương của sản phẩm ngăn chặn nhận dạng sai 4là số nguyên tố và rất hữu ích ở đây vì nó đảm bảo rằng chỉ 0hoặc 1sẽ được trả về, cho phép lựa chọn giá trị được thêm vào bằng cách nhân kết quả bằng cách nhân kết quả i.

Xác định các số nguyên tố 'sinh đôi'

Bây giờ chúng tôi tạo ra một bộ furter, chứa tất cả các yếu tố của l-k, yếu tố khôn ngoan. Giao điểm của tập hợp này và lsau đó được tìm thấy bằng cách sử dụng &, để lại một tập hợp chỉ chứa các phần tử chung cho cả hai tập hợp. Một số ichỉ có trong cả hai bộ nếu cả hai ii+klà số nguyên tố, có nghĩa là số này để lại đầu ra mong muốn. Tuy nhiên, nếu klà số nguyên tố, 0sẽ có mặt trong cả hai bộ, nghĩa là phải xóa cái này trước khi quay lại.


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}&lhoạt động với 83 byte trong Python 2. Ngay cả trong 3, xây dựng một bộ theo cách này sẽ tiết kiệm được một số byte.
Dennis

@Dennis Cảm ơn - điều này không lưu một vài byte trong Python 3. Tuy nhiên, tôi đã phải xóa 0khỏi tập cuối cùng, vì nếu klà số nguyên tố, điều này bị trả lại nhầm .
TheBikingViking 26/8/2016

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}

Ung dung:

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

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

[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

Toán học, 43 byte

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

Tạo tất cả các số nguyên tố nhỏ hơn hoặc bằng giới hạn trên. Thêm sự khác biệt của độ tuổi vào kết quả. Chọn số nguyên tố trong số đó. Trừ đi sự khác biệt của độ tuổi với kết quả.


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}

Giải trình:

-> \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 」

}


1

Trên thực tế , 12 byte

Đầu vào là usau đó k. Gợi ý chơi golf chào mừng. Hãy thử trực tuyến!

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

Ungolfing:

╖              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

Không giống như giải pháp R khác được đăng, giải pháp này lấy đầu vào từ 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," ")})

Ung dung:

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=[])

Thí dụ:

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

Bình thường, 13 byte

f&P_TP_+ThQSe

Một chương trình lấy đầu vào của danh sách biểu mẫu [k, u]và in danh sách.

Dùng thử trực tuyến

Làm thế nào nó hoạt động

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.