Zmienne Prime „Twins”

18

Jestem 2/3 bliźniakami z moim bratem, tj. Urodziłem się tego samego dnia tego samego miesiąca, ale dwanaście lat później. Kiedy miałem 5 lat, miał 17 lat, obie liczby pierwsze; ostatnia para wieków, na którą możemy racjonalnie liczyć, to [71, 83], przy czym oboje żyjemy i jesteśmy w stanie świętować ten przypadkowy jubileusz.

Zadanie

Utwórz kod, który

  • przyjmuje na wejściu dwie liczby całkowite: różnicę między licznikiem a „bliźniakiem” jako dodatnią liczbą całkowitą k (no tak, jestem młodszy), a górną granicą jako dodatnią liczbą całkowitą u (uwarunkowanie czasu działania)

  • i daje wynik jako tablicę lub listę wszystkich liczb i mniejszych lub równych u, dla których oba i i I + K są liczbami pierwszymi. Dane wyjściowe nie muszą być sortowane.

Przypadki testowe

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]

Edytować

Ponieważ nie udało mi się określić górnej granicy, mile widziane są zarówno rozwiązania integracyjne, jak i ekskluzywne.

Edytuj nr 2

Wyzwanie kończy się 1 września, tydzień od początku.
Wygląda na to, że mamy zwycięzcę, ale w przypadku remisu popularność jest rozstrzygająca; w tym przypadku „sekunda” zostanie zrekompensowana poprzez nagrodę.

użytkownik3819867
źródło
Związane z.
Martin Ender,

Odpowiedzi:

5

Galaretka, 8 7 bajtów

+ÆR©_f®

Wypróbuj online!

Wyjaśnienie

+          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
źródło
Gratulacje @ Pietu1998!
user3819867,
6

Brachylog , 27 23 bajtów

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

Wypróbuj online!

Sprawdź wszystkie przypadki testowe.

Predykat 0 (główny predykat)

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

Predykat 1 (predykat pomocniczy)

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
Leaky Nun
źródło
4

Pyke, 10 bajtów

S#_PiQ+_P&

Wypróbuj tutaj!

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

Również 10 bajtów:

S#_DP.IQ-P

Wypróbuj tutaj!

niebieski
źródło
Kolejny 10 bajtów .
Leaky Nun
@LeakyNum to naprawdę sprytne!
Niebieski,
4

Oktawa, 34 33 bajty

@(k,u)(a=primes(u))(isprime(a+k))
alephalpha
źródło
Świetne podejście! Pozwoliło mi to zmniejszyć liczbę z 11 do 8 bajtów w mojej odpowiedzi
Luis Mendo
4

MATL , 8 bajtów

Podziękowania dla @alephalpha za jego podejście , które pomogło mi zaoszczędzić 3 bajty

Zqti+Zp)

Wypróbuj 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
Luis Mendo
źródło
4

Python 3, 114 92 90 bajtów

Dzięki @Dennis za -2 bajty

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}

Funkcja, która pobiera dane wejściowe za pomocą argumentu i zwraca nieposortowany zestaw. Jest to wyłączne w odniesieniu do górnej granicy.

Używa metody z odpowiedzi @ xnor tutaj, aby znaleźć liczby pierwsze.

Wypróbuj na Ideone

Jak to działa

Najlepsze znalezisko

Najpierw inicjalizujemy wartość testową ii produkt Pjako 1oraz listę liczb pierwszych ljako zestaw zawierający 0. Następnie wykonywana jest whilepętla, która testuje wszystkie wartości z izakresu [1, u+k-1]dla pierwotności. Chodzi o to, że pomnożenie Pprzez i^2pod koniec każdej iteracji Pbierze wartość (i-1)!^2podczas testowania i, tzn. Iloczyn liczb całkowitych [1, i+1]podniesionych do kwadratu. Rzeczywisty test pierwszeństwa jest następnie wykonywany przez obliczenie P mod i; jeśli to zwraca zero, to inie może być liczbą pierwszą, ponieważ implikuje to, że ijest podzielna przez co najmniej jedną z wartości, które składają się na produkt. Jeśli to wróci 1, toi musi być liczbą pierwszą, ponieważ nie jest podzielna przez żadną z wartości w produkcie. Jeśli ijest liczbą pierwszą, jest dołączana l, a jeśli nie,0 jest dołączana. Kwadrat produktu nie pozwala na fałszywą identyfikację 4jako liczby pierwszej i jest przydatny, ponieważ gwarantuje, że zostanie on zwrócony tylko 0lub wyłącznie 1, umożliwiając wybór wartości, która ma być dołączona, po prostu przez pomnożenie wyniku przez i.

Identyfikacja liczb pierwszych „bliźniaczych”

Teraz tworzymy zestaw furter, zawierający wszystkie elementy l-k, jeśli chodzi o elementy. Przecięcie tego zestawu, a lnastępnie znajduje się za pomocą &, co pozostawia zestaw zawierający tylko elementy wspólne dla obu zbiorów. Wiele ijest tylko w obu zestawach, gdy oba ii i+ksą pierwszymi, co oznacza, że pozostawia pożądany wynik. Jeśli jednak kjest liczbą pierwszą, 0będzie występować w obu zestawach, co oznacza, że ​​należy ją usunąć przed powrotem.

TheBikingViking
źródło
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}&ldziała na 83 bajty w Pythonie 2. Nawet w 3, zbudowanie zestawu w ten sposób powinno zaoszczędzić trochę bajtów.
Dennis
@Dennis Thanks - to oszczędza kilka bajtów w Pythonie 3. Jednak musiałem usunąć 0z końcowego zestawu, ponieważ jeśli kjest liczbą pierwszą, to przez pomyłkę zostanie zwrócone .
TheBikingViking
3

R, 98 bajtów

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}

Nie golfowany:

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
źródło
2

Java 7, 185 175 bajtów

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

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wynik:

[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
źródło
2

PARI / GP, 39 bajtów

k->u->[x|x<-primes([1,u]),isprime(x+k)]
alephalpha
źródło
2

Mathematica, 43 bajty

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

Wygeneruj wszystkie liczby pierwsze mniejsze lub równe górnej granicy. Dodaj różnicę wieku do wyniku. Wybierz liczby pierwsze spośród nich. Odejmij różnicę wieku do wyniku.


źródło
2

Szybki, 142 bajty

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
źródło
2

Perl 6 ,  39  37 bajtów

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

Wyjaśnienie:

-> \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
źródło
2

SILOS , 205 bajtów

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

Wypróbuj online!

Test pierwotności według twierdzenia Wilsona .

Leaky Nun
źródło
1

Właściwie 12 bajtów

Dane wejściowe są uwtedy k. Sugestie dotyczące gry w golfa mile widziane. Wypróbuj 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.
Sherlock9
źródło
1

R 104 bajty

W przeciwieństwie do innych opublikowanych rozwiązań R, ten pobiera dane wejściowe ze standardowego wejścia.

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," ")})

Nie golfowany:

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
źródło
1

JavaScript (ES6), 90 83 80 75 bajtów

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

Przykład:

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
źródło
1

Pyth, 13 bajtów

f&P_TP_+ThQSe

Program, który pobiera dane z listy formularza [k, u] i drukuje listę.

Wypróbuj online

Jak to działa

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
źródło