Variable Prime "Gemelos"

18

Soy 2/3 gemelos con mi hermano, es decir, nací el mismo día del mismo mes pero doce años después. Cuando tenía 5 años, él tenía 17 años, ambos primos; el último par de edades con el que podemos contar razonablemente es [71, 83], estando ambos vivos y pudiendo celebrar este jubileo coincidente.

Tarea

Crea un código que

  • toma dos enteros como entrada: la diferencia entre el contador y el "gemelo" como un entero positivo k (bueno, sí, soy el más joven) y el límite superior como un entero positivo u (consideración de tiempo de ejecución)

  • y da salida como una matriz o lista de todos los números i inferiores o iguales a u para los cuales tanto i como i + k son números primos. La salida no necesita ser ordenada.

Casos de prueba

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]

Editar

Como no pude especificar el límite superior, las soluciones inclusivas y exclusivas son bienvenidas.

Editar No. 2

El desafío termina el 1 de septiembre, una semana desde el comienzo.
Parece que tenemos un ganador, pero en caso de empate, la popularidad es el desempate; en este caso, el "segundo" será compensado mediante recompensa.

usuario3819867
fuente
Relacionado.
Martin Ender

Respuestas:

5

Jalea, 8 7 bytes

+ÆR©_f®

Pruébalo en línea!

Explicación

+          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
PurkkaKoodari
fuente
¡Felicitaciones @ Pietu1998!
user3819867
6

Brachylog , 27 23 bytes

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

Pruébalo en línea!

Verifique todos los casos de prueba.

Predicado 0 (predicado principal)

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

Predicado 1 (predicado auxiliar)

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
Monja permeable
fuente
4

Pyke, 10 bytes

S#_PiQ+_P&

Pruébalo aquí!

S#         - filter(range(input_2), V) as i
  _P       -   is_prime(i)
         & -  ^ & V
    iQ+    -    i + input_1
       _P  -   is_prime(^)

También 10 bytes:

S#_DP.IQ-P

Pruébalo aquí!

Azul
fuente
Otro 10 bytes .
Leaky Nun
@LeakyNum, ¡eso es realmente inteligente!
Azul
4

Octava, 34 33 bytes

@(k,u)(a=primes(u))(isprime(a+k))
alephalpha
fuente
Gran enfoque! Me permitió reducir de 11 a 8 bytes en mi respuesta
Luis Mendo
4

MATL , 8 bytes

Gracias a @alephalpha por su enfoque , que me ayudó a ahorrar 3 bytes

Zqti+Zp)

Pruébalo en línea!

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
Luis Mendo
fuente
4

Python 3, 114 92 90 bytes

Gracias a @Dennis por -2 bytes

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}

Una función que toma datos a través de argumentos y devuelve un conjunto sin clasificar. Esto es exclusivo con respecto al límite superior.

Esto usa el método en la respuesta de @ xnor aquí para encontrar números primos.

Pruébalo en Ideone

Cómo funciona

Primer hallazgo

Primero inicializamos un valor de prueba iy un producto Pcomo 1, y una lista de primos lcomo el conjunto que contiene 0. Luego, se ejecuta un whilebucle que prueba todos los valores ien el rango [1, u+k-1]de primalidad. La idea es que al multiplicar Ppor i^2al final de cada iteración, Ptoma el valor (i-1)!^2durante la prueba i, es decir, el producto de los enteros al [1, i+1]cuadrado. La prueba de primalidad real se realiza calculando P mod i; si esto devuelve cero, entonces ino puede ser primo ya que esto implica que ies divisible por al menos uno de los valores que componen el producto. Si esto vuelve 1, entoncesidebe ser primo ya que no es divisible por ninguno de los valores del producto. Si ies primo, se agrega a l, y si no, 0se agrega. La cuadratura del producto evita la identificación falsa de 4como primo, y es útil aquí ya que garantiza que solo 0o 1será devuelto, permitiendo que se elija el valor que se agregará simplemente multiplicando el resultado por i.

Identificación de primos 'gemelos'

Ahora creamos un conjunto adicional, que contiene todos los elementos de l-k, en cuanto a elementos. La intersección de este conjunto y lluego se encuentra usando &, lo que deja un conjunto que contiene solo los elementos comunes a ambos conjuntos. Un número ies única en ambos conjuntos si ambos iy i+kson primos, lo que significa que esto deja la salida deseada. Sin embargo, si kes primo, 0estará presente en ambos conjuntos, lo que significa que debe eliminarse antes de regresar.

TheBikingViking
fuente
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}&lfunciona para 83 bytes en Python 2. Incluso en 3, construir un conjunto de esta manera debería ahorrar algunos bytes.
Dennis
@Dennis Gracias: esto ahorra algunos bytes en Python 3. Sin embargo, tuve que eliminar 0del conjunto final, ya que si kes primo, esto se devuelve por error .
TheBikingViking
3

R, 98 bytes

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}

Sin golf:

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
Frédéric
fuente
2

Java 7, 185 175 bytes

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

Ungolfed y código de prueba:

Pruébalo aquí

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

Salida:

[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]
Kevin Cruijssen
fuente
2

PARI / GP, 39 bytes

k->u->[x|x<-primes([1,u]),isprime(x+k)]
alephalpha
fuente
2

Mathematica, 43 bytes

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

Genere todos los primos menores o iguales al límite superior. Agregue la diferencia de edades al resultado. Seleccione números primos entre ellos. Resta la diferencia de edades al resultado.


fuente
2

Swift, 142 bytes

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}}
jrich
fuente
2

Perl 6 ,  39  37 bytes

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

Explicación:

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

}
Brad Gilbert b2gills
fuente
2

SILOS , 205 bytes

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

Pruébalo en línea!

Prueba de Primalty por el teorema de Wilson .

Monja permeable
fuente
1

En realidad , 12 bytes

La entrada es uentonces k. Sugerencias de golf bienvenidas. Pruébalo en línea!

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

No golfista:

╖              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.
Sherlock9
fuente
1

R, 104 bytes

A diferencia de la otra solución R publicada, esta toma la entrada de 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," ")})

Sin golf:

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
    }
)
rturnbull
fuente
1

Javascript (ES6), 90 83 80 75 bytes

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

Ejemplo:

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

Arnauld
fuente
1

Pyth, 13 bytes

f&P_TP_+ThQSe

Un programa que toma la entrada de una lista del formulario [k, u]e imprime una lista.

Pruébalo en línea

Cómo funciona

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
TheBikingViking
fuente