Prime variável "Twins"


18

Sou 2/3 gêmeos com meu irmão, ou seja, nasci no mesmo dia do mesmo mês, mas doze anos depois. Quando eu tinha 5 anos, ele tinha 17 anos, ambos primos; o último par de idades com o qual podemos razoavelmente contar é [71, 83], estando ambos vivos e capazes de celebrar esse jubileu coincidente.

Tarefa

Crie um código que

  • recebe dois números inteiros como entrada: a diferença entre o contador e o "gêmeo" como um número inteiro positivo k (bem, sim, eu sou o mais novo) e o limite superior como um número inteiro positivo u (consideração em tempo de execução)

  • e fornece a saída como uma matriz ou lista de todos os números i inferiores ou iguais a u para os quais i e i + k são primos. A saída não precisa ser classificada.

Casos de teste

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 não especifiquei o limite superior, as soluções inclusivas e exclusivas são bem-vindas.

Editar No. 2

O desafio termina em 1º de setembro, uma semana desde o início.
Parece que temos um vencedor, mas em caso de empate a popularidade é o desempate; neste caso, o "segundo" será compensado via recompensa.


Respostas:


5

Geléia, 8 7 bytes

+ÆR©_f®

Experimente online!

Explicação

+          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

Parabéns @ Pietu1998!
User3819867

6

Braquilog , 27 23 bytes

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

Experimente online!

Verifique todos os casos de teste.

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



4

Oitava, 34 33 bytes

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

Ótima abordagem! Isso me permitiu reduzir frrom 11 a 8 bytes na minha resposta
Luis Mendo

4

MATL , 8 bytes

Agradecemos a @alephalpha por sua abordagem , que me ajudou a economizar 3 bytes

Zqti+Zp)

Experimente 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 bytes

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

Uma função que recebe entrada via argumento e retorna um conjunto não classificado. Isso é exclusivo em relação ao limite superior.

Isso usa o método da resposta do @ xnor aqui para encontrar números primos.

Experimente no Ideone

Como funciona

Principal descoberta

Inicialmente, inicializamos um valor de teste ie um produto Pcomo 1e uma lista de números primos lcomo o conjunto que contém 0. Em seguida, é executado um whileloop que testa todos os valores do iintervalo [1, u+k-1]para primalidade. A ideia é que, multiplicando Ppor i^2no final de cada iteração, Passume o valor (i-1)!^2durante o teste i, ou seja, o produto dos inteiros [1, i+1]ao quadrado. O teste de primalidade real é então realizado através do cálculo P mod i; se isso retornar zero, inão poderá ser primo, pois isso implica que ié divisível por pelo menos um dos valores que compõem o produto. Se isso retornar 1, entãoideve ser primo, pois não é divisível por nenhum dos valores do produto. Se ifor primo, será anexado e l, se não, 0será anexado. A quadratura do produto impede a identificação falsa de 4primo e é útil aqui, pois garante que apenas 0ou 1será retornado, permitindo que a escolha do valor a ser acrescentado seja feita simplesmente multiplicando o resultado por i.

Identificação de primos 'gêmeos'

Agora criamos um conjunto furter, contendo todos os elementos de elemento a elemento l-k. A interseção deste conjunto e lé então encontrada usando &, o que deixa um conjunto contendo apenas os elementos comuns a ambos os conjuntos. Um número ié apenas em ambos os conjuntos se ambos ie i+ksão primos, o que significa que isso deixa a saída desejada. No entanto, se kfor primo, 0estará presente nos dois conjuntos, o que significa que isso deve ser removido antes do retorno.


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 em Python 2. Mesmo em 3, construir um conjunto dessa maneira deve economizar alguns bytes.
Dennis

@ Dennis Obrigado - isso economiza alguns bytes no Python 3. No entanto, eu tive que remover 0do conjunto final, pois se kfor primo, isso por engano é retornado .
TheBikingViking 26/08

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}

Ungolfed:

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 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 & código de teste:

Experimente aqui.

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

Resultado:

[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

PARI / GP, 39 bytes

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

2

Mathematica, 43 bytes

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

Gere todos os números primos menores ou iguais ao limite superior. Adicione a diferença de idades ao resultado. Selecione números primos entre eles. Subtraia a diferença de idades para o resultado.


2

Rápido, 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}}

2

Perl 6 ,  39  37 bytes

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

Explicação:

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

Experimente online!

Teste de primazia pelo teorema de Wilson .


1

Na verdade , 12 bytes

A entrada é uentão k. Sugestões de golfe são bem-vindas. Experimente online!

╖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 bytes

Ao contrário da outra solução R publicada, esta recebe a 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," ")})

Ungolfed:

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

Exemplo:

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

Pitão, 13 bytes

f&P_TP_+ThQSe

Um programa que recebe entrada de uma lista do formulário [k, u]e imprime uma lista.

Experimente online

Como 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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.