Variable Prime "Zwillinge"

18

Ich bin 2/3 Zwillinge mit meinem Bruder, dh am selben Tag im selben Monat, aber zwölf Jahre später geboren. Als ich 5 war, war er 17, beide Primzahlen; Das letzte Zeitalter, auf das wir uns verlassen können, ist [71, 83], da wir beide am Leben sind und in der Lage sind, dieses zufällige Jubiläum zu feiern.

Aufgabe

Erstellen Sie einen Code, der

  • Nimmt zwei Ganzzahlen als Eingabe: die Differenz zwischen dem Zähler und dem "Zwilling" als positive Ganzzahl k (na ja, ich bin die jüngere) und die Obergrenze als positive Ganzzahl u (Laufzeitüberlegung)

  • und gibt als Array oder Liste alle i Zahlen kleiner oder gleich u aus, für die sowohl i als auch i + k Primzahlen sind. Die Ausgabe muss nicht sortiert werden.

Testfälle

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]

Bearbeiten

Da ich die Obergrenze nicht angegeben habe, sind sowohl inklusive als auch exklusive Lösungen willkommen.

Edit Nr. 2

Die Challenge endet am 1. September, eine Woche nach dem Start.
Sieht so aus, als hätten wir einen Gewinner, aber im Falle eines Unentschieden ist der Unentschieden beliebt. in diesem Fall wird die "Sekunde" durch Kopfgeld ausgeglichen.

user3819867
quelle
Verbunden.
Martin Ender

Antworten:

5

Gelee, 8 7 Bytes

+ÆR©_f®

Probieren Sie es online!

Erläuterung

+          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
quelle
Glückwunsch @ Pietu1998!
user3819867
6

Brachylog , 27 23 Bytes

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

Probieren Sie es online!

Überprüfen Sie alle Testfälle.

Prädikat 0 (Hauptprädikat)

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

Prädikat 1 (Hilfsprädikat)

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
Undichte Nonne
quelle
4

Oktave, 34 33 Bytes

@(k,u)(a=primes(u))(isprime(a+k))
Alephalpha
quelle
Toller Ansatz! Es erlaubte mir, 11 bis 8 Bytes in meiner Antwort zu reduzieren
Luis Mendo
4

MATL , 8 Bytes

Dank an @alephalpha für seinen Ansatz , der mir dabei geholfen hat, 3 Bytes zu sparen

Zqti+Zp)

Probieren Sie es 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
quelle
4

Python 3, 114 92 90 Bytes

Danke an @Dennis für -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}

Eine Funktion, die Eingaben über Argumente entgegennimmt und eine unsortierte Menge zurückgibt. Dies gilt ausschließlich für die obere Schranke.

Dies verwendet die Methode in @ xnor Antwort hier Primzahlen zu finden.

Probieren Sie es auf Ideone

Wie es funktioniert

Prime finden

Wir initialisieren zuerst einen Testwert iund ein Produkt Pals 1und eine Liste von Primzahlen lals den Satz, der enthält 0. Dann wird eine whileSchleife ausgeführt, die alle Werte iim Bereich [1, u+k-1]auf Primalität prüft . Die Idee ist, dass durch Multiplizieren Pmit i^2am Ende jeder Iteration Pder Wert (i-1)!^2während des Testens genommen wird i, dh das Produkt der ganzen Zahlen zum [1, i+1]Quadrat. Der eigentliche Primalitätstest wird dann durch Berechnen durchgeführt P mod i; Wenn dies null ergibt , ikann es keine Primzahl sein, da dies impliziert, dass ies durch mindestens einen der Werte teilbar ist, aus denen das Produkt besteht. Wenn dies zurückkommt 1, dannimuss eine Primzahl sein, da sie nicht durch einen der Werte im Produkt teilbar ist. Wenn iprime ist, wird es angehängt lund wenn nicht, 0wird es angehängt. Das Quadrieren des Produkts verhindert eine falsche Identifizierung 4als Primzahl und ist hier nützlich, da es garantiert, dass nur 0oder zurückgegeben 1wird, sodass die Auswahl des anzuhängenden Werts durch einfaches Multiplizieren des Ergebnisses mit vorgenommen werden kann i.

Identifizierung von 'Zwillings'-Primzahlen

Wir erstellen jetzt eine weitere Menge, die alle Elemente von l-kelement-weise enthält. Der Schnittpunkt dieser Menge lwird dann mit ermittelt &, wodurch eine Menge übrig bleibt, die nur die Elemente enthält, die beiden Mengen gemeinsam sind. Eine Zahl iist nur in beiden Sätzen vorhanden, wenn beide iund i+kPrimzahlen sind. Dies bedeutet, dass die gewünschte Ausgabe erhalten bleibt. Wenn kes sich jedoch um eine Primzahl handelt, 0ist es in beiden Sätzen vorhanden, was bedeutet, dass diese vor der Rücksendung entfernt werden muss.

TheBikingViking
quelle
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}&lFunktioniert in Python 2 für 83 Bytes. Selbst in 3 sollte das Erstellen einer Menge auf diese Weise einige Bytes einsparen.
Dennis
@ Dennis Dank - das tut speichert ein paar Bytes in Python 3. Allerdings habe ich entfernen 0aus dem letzten Satz, denn wenn eine kPrimzahl ist, dies wird fälschlicherweise zurückgegeben .
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}

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
Frédéric
quelle
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 & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

[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
quelle
2

PARI / GP, 39 Bytes

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

Mathematica, 43 Bytes

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

Generieren Sie alle Primzahlen, die kleiner oder gleich der Obergrenze sind. Addieren Sie den Altersunterschied zum Ergebnis. Wählen Sie Primzahlen aus. Subtrahieren Sie die Altersdifferenz zum Ergebnis.


quelle
2

Schnell, 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
quelle
2

Perl 6 ,  39  37 Bytes

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

Erläuterung:

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

Probieren Sie es online!

Primalitätstest nach Wilsons Theorem .

Undichte Nonne
quelle
1

Eigentlich 12 Bytes

Eingabe ist udann k. Golfvorschläge sind willkommen. Probieren Sie es 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
quelle
1

R, 104 Bytes

Im Gegensatz zu der anderen R-Lösung, die veröffentlicht wurde, bezieht sich diese auf 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
    }
)
rturnbull
quelle
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=[])

Beispiel:

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
quelle
1

Pyth, 13 Bytes

f&P_TP_+ThQSe

Ein Programm, das eine Liste des Formulars [k, u]eingibt und eine Liste druckt.

Probieren Sie es online aus

Wie es funktioniert

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
quelle