可变素数“双胞胎”


18

我和我的兄弟是2/3双胞胎,即在同一个月的同一天出生,但十二年后出生。我5岁时,他17岁,都是素数。我们可以合理地指望的最后一对年龄是[71,83],我们俩都还活着并且能够庆祝这个偶然的禧年。

任务

创建一个代码

  • 接受两个整数作为输入:计数器和“ twin”之间的差为正整数k(是的,我是年轻的),上限为正整数u(运行时注意)

  • 并给出了所有的阵列或列表输出不是数字低于或等于ü对于其中两个I + 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日结束,距比赛开始一周。
看起来我们有赢家,但在平局的情况下,平局是平局。在这种情况下,“第二”将通过赏金得到补偿。


Answers:


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'9

6

Brachylog27 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

4

MATL,8字节

感谢@alephalpha 的方法,它帮助我节省了3个字节

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

Python 3,114 92 90字节

感谢@Dennis提供-2个字节

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}

一个通过参数接受输入并返回未排序集合的函数。就上限而言,这是排他的。

这将使用@ XNOR的回答方法在这里找到素数。

在Ideone上尝试

怎么运行的

主要发现

我们首先将一个测试值i和一个乘积初始化P1一个素数列表l作为包含的集合0。然后,执行一个while循环,测试i该范围内所有值的[1, u+k-1]素性。这个想法是,在每次迭代结束时乘以P,取值必须是质数,因为它不能被乘积中的任何值整除。如果是质数,则将其附加到,如果不是质数,则将其附加。产品的平方可以防止错误地标识为素数,并且在这里很有用,因为它可以确保仅i^2P(i-1)!^2在测试i,也就是整数的乘积[1, i+1]的平方。然后通过计算执行实际的素数检验P mod i;如果它返回零,则i不能为素数,因为这意味着i可以被构成乘积的至少一个值整除。如果返回1,则iil0401返回或将返回,允许通过简单地将结果乘选择要附加的值i

识别“双”素数

现在,我们创建一个Furter集,其中包含l-kelement-wise的所有元素。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在Python 2中可以使用83个字节。即使在3个中,以这种方式构造一个set也可以节省一些字节。
丹尼斯

@Dennis谢谢-这确实在Python 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

Java 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

Mathematica,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

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

}

2

SILOS,205个字节

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

在线尝试!

威尔逊定理对素数的检验。


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

Javascript(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.