가변 프라임“트윈”


18

나는 동생과 2/3 쌍둥이입니다. 즉 같은 달 같은 날에 12 년 후에 태어났습니다. 내가 5 살이었을 때, 그는 17 세였다. 우리가 합리적으로 의지 할 수있는 마지막 시대는 [71, 83]이며, 우리 둘 다 살아 있고이 우연의 축제를 축하 할 수 있습니다.

직무

코드를 작성하십시오

  • 두 개의 정수를 입력으로 취합니다. 카운터와 "트윈"사이의 양을 양의 정수 k (아, 더 젊습니다)로, 상한을 양의 정수 u로 표시합니다 (런타임 고려)

  • 모든 배열 또는리스트로서 출력 제공 I 번호 이하일 U를 하는 양쪽 II + K는 소수이다. 출력을 정렬 할 필요는 없습니다.

테스트 사례

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]

편집하다

상한을 지정하지 않았으므로 포괄적 솔루션과 독점 솔루션을 모두 환영합니다.

편집 번호 2

도전은 시작부터 일주일 인 9 월 1 일에 끝납니다.
우승자가있는 것처럼 보이지만 동점 인기의 경우 동점자입니다. 이 경우 "두 번째"는 현상금을 통해 보상됩니다.


답변:


5

젤리, 8 7 바이트

+ÆR©_f®

온라인으로 사용해보십시오!

설명

+          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

축하합니다 @ Pietu1998!
user3819867

6

Brachylog , 27 23 바이트

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

온라인으로 사용해보십시오!

모든 테스트 케이스를 확인하십시오.

술어 0 (주 술어)

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

술어 1 (보조 술어)

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

옥타브, 34 33 바이트

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

훌륭한 접근 방식! 내 대답에서 frrom을 11에서 8 바이트로 줄일 수있었습니다.
Luis Mendo 10

4

MATL , 8 바이트

3 바이트를 절약하는 데 도움이되는 그의 접근 방식 으로 @alephalpha에게 감사드립니다.

Zqti+Zp)

온라인으로 사용해보십시오!

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

파이썬 3, 114 92 90 바이트

-2 바이트에 대한 @Dennis 덕분에

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}

인수를 통해 입력을 받고 정렬되지 않은 세트를 리턴하는 함수입니다. 상한과 관련하여 배타적입니다.

이것은 @ 배타적 부정의 대답 방법을 사용하여 여기에 소수를 찾을 수 있습니다.

Ideone에서 사용해보십시오

작동 원리

주요 발견

먼저 테스트 값 i과 제품을 P로 초기화하고 1소수 l를 포함하는 세트 로 소수 목록을 초기화합니다 0. 그런 다음, 우선 순위 범위 while의 모든 값을 테스트 하는 루프 가 실행됩니다. 아이디어는 곱한 것입니다 의해 각 반복의 끝에서, 값을 가져 테스트하는 동안 , 즉 정수의 제품은 제곱. 그런 다음 실제 원시성 테스트는 다음을 계산하여 수행됩니다 . 이것이 0을 리턴하면, 이는 제품을 구성하는 값 중 하나 이상으로 나눌 수 있음을 의미하므로 소수 일 수 없습니다 . 이것이을 반환 하면i[1, u+k-1]Pi^2P(i-1)!^2i[1, i+1]P mod iii1i제품의 값으로 나눌 수 없으므로 소수 여야합니다. 경우 i소수, 그것은 추가됩니다 l, 그렇지 않은 경우, 0추가됩니다. 제품의 제곱은 4소수로 잘못 식별되는 것을 방지 하며 여기에 유용 0하거나 1반환 만 보장 하므로 결과에 단순히 곱하여 값을 추가 할 수 있습니다 i.

'쌍둥이'소수의 식별

이제 요소 별의 모든 요소를 ​​포함하는 퍼터 세트를 만듭니다 l-k. 이 집합의 교집합은를 l사용하여 찾은 다음 &두 집합에 공통 인 요소 만 포함 된 집합을 남깁니다. 숫자가 i모두있는 경우에만 두 세트에 ii+k주요되는이 잎 원하는 출력을 의미한다. 그러나 k소수 인 경우 0두 세트 모두에 존재하므로 리턴하기 전에 제거해야합니다.


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}&l파이썬 2에서 83 바이트에서 작동합니다.
Dennis

@Dennis Thanks-파이썬 3에서 몇 바이트를 절약합니다. 그러나 0최종 세트에서 제거해야했습니다. k프라임이면 실수로 반환 됩니다.
TheBikingViking

3

R, 98 바이트

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}

언 골프 :

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

자바 7, 185 175 바이트

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

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

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

산출:

[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

수학, 43 바이트

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

상한 이하의 모든 소수를 생성하십시오. 결과에 연령 차이를 더하십시오. 그중 소수를 선택하십시오. 결과의 연령 차이를 뺍니다.


2

스위프트, 142 바이트

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

펄 6 ,  39  37 바이트

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

설명:

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

실제로 12 바이트

u그러면 입력이 k입니다. 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

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

풀기 :

╖              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 바이트

게시 된 다른 R 솔루션과 달리이 솔루션은 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," ")})

언 골프 드 :

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

자바 스크립트 (ES6), 90 83 80 75 바이트

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

예:

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 바이트

f&P_TP_+ThQSe

양식 목록을 입력하고 목록을 [k, u]인쇄하는 프로그램입니다 .

온라인으로 사용해보십시오

작동 원리

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.