Zwei Primzahlen werden als Doppelprimzahlen definiert, wenn sie sich um zwei unterscheiden. Zum Beispiel sind 3 und 5 zwei Primzahlen, ebenso wie 29 und 31.
Schreiben Sie ein Programm, das das n-te Paar von Doppelprimzahlen findet (wobei n von STDIN stammt) und diese durch Komma und Leerzeichen getrennt auf STDOUT ausgibt. Das ist Code-Golf, also gewinnt der kürzeste Code.
Beispieleingabe:
3
Beispielausgabe:
11, 13
Antworten:
Haskell 118
Brute-Force alle Doppelprimzahlen und druckt das n- te Paar.
quelle
interact
stattdessen verwendenputStrLn
, können Sie noch weiter gehen und dies auf 105:a#b=all((>0).rem a)[2..a-b];main=interact$(!!)[show n++", "++show(n+2)|n<-[2..],n#1,(n+2)#2].(+)(-1).read
CJam,
2926 BytesProbieren Sie es online aus.
Beispiele
Wie es funktioniert
quelle
Perl,
1018787 Zeichen, die auf Ascheplers Kommentar aufbauen
101 Zeichen, frühere Antwort
Verwendung:
Erläuterung
Die Funktionsweise des Nicht-Primalitäts-Regex wird in dieser SO-Frage erläutert .
quelle
$n=pop;$r='^1$|^(11+?)\1+$';($t=1x$s)=~$r||"11$t"=~$r||--$n||exit say("$s, ",$s+2)while++$s
C: 113
Probelauf:
Vielen Dank für die Hilfe von Dennis, Bebe und Alchymist.
quelle
scanf
anstelle von Befehlszeilenargumenten verwenden. Aucho=0
ist unnötig, dao
global ist.main
könnte eine int-Standardvariable enthalten, inkrementierenc
undi
zwischen Zuweisungen und Anweisungen könnte den Code verkürzen, die Zuweisung vonl
könnte zum dritten Block der ersten for-Schleife zurückgeführt werden, so dass Sie keine geschweiften Klammern benötigen und definitiv nur ein Trennzeichen in printf verwenden könnten mach es kompakter.c<=i-1
, was einfach nur doof ist.i
desl
Zuweisungsausdrucks zu rasieren , da der (neue) Wert voni
zum Dekrementieren verwendet wirdn
. Irgendwelche Tipps?CJam - 26
Es funktioniert für Primzahlen kleiner als 10000; Sie können
4
größere Zahlen durch einen höheren Exponenten ersetzen (möglicherweise bis zu 10 20 ), aber das Programm wird langsamer und benötigt mehr Speicher.Versuchen Sie es unter http://cjam.aditsu.net/
Erläuterung:
1e4,
schafft die array [0 1 2 ... 9999]{mp},
wählt nur die Primzahlen_2f-
kopiert das Array und 2 subtrahiert von jedem Einzelteil&
schneidet die zwei Arrays, wodurch die unteren Primzahlen aus jedem Zwillingspaar prime findenqi
die Eingabe und wandelt lesen auf ganzzahlige(=
die justiert index und ruft die entsprechende (niedrigere) Doppelprimzahl aus dem Array ab,_2+
kopiert die Primzahl und fügt 2 hinzu, wobei", "\
Komma und Leerzeichen zwischen den beiden Primzahlen stehenquelle
Mathematica - 63 Zeichen
Anmerkungen
Dies ist in der Tat eine ziemlich einfache Implementierung. Verkürzung führte zu fast keiner Verschleierung.
NextPrime
ist ein Builtin, das nach einer Zahl die nächste Primzahl findet.NestWhile[NextPrime,#,#2-#1!=2&,2]&
ist eine anonyme Funktion, die nach einer Zahl die größere Primzahl des nächsten Twin-Prim-Paares findet.Nest
wendet diese anonyme funktionn
mal an.Print[#-2,", ",#]&
ist eine anonyme Funktion, die gemäß den Spezifikationen auf stdout druckt. Leider nimmt dies allein 18 Zeichen der 63-Zeichen-Lösung ein.Beispiel
Update: Durch die Neuimplementierung dieser CJam-Lösung können zwei Zeichen gespeichert werden . Dieser Algorithmus begrenzt jedoch den Maximalwert von
n
. Ersetzen Sie einfach dasNest...
Teil durchIntersection[#,#-2][[5]]&@Prime@Range[999]
quelle
Javascript (E6) 92
96Kürzere und konforme - Verwenden Sie die Spidermonkey-Shell, um stdin zu lesen / stdout zu schreiben (mit Komma und Leerzeichen). Es findet das 10000. Paar 1260989, 1260991 in weniger als einer Minute auf meinem PC.
Könnte kürzer sein, wenn man
p[n]=o=n
anstelle von verwendetp.push(o=n)
, so dass das p-Array spärlich ist. Aber das ist ziemlich langsam und ich werde sowieso nicht für die Codelänge gewinnen.So probieren Sie die Firefox-Konsole aus:
Ungolfed
Eine Funktion, die alle ersten m Zwillinge gefunden hat (gibt den größten Wert zurück):
Beispiel:
console.log(T(50))
[5, 7, 13, 19, 31, 43, 61, 73, 103, 109, 139, 151, 181, 193, 199, 229, 241, 271, 283, 313, 349, 421, 433, 463, 523, 571, 601, 619, 643, 661, 811, 823, 829, 859, 883, 1021, 1033, 1051, 1063, 1093, 1153, 1231, 1279, 1291, 1303, 1321, 1429, 1453, 1483, 1489]
Nur das letzte:
Nehmen Sie dann diese 2 Zeilen und fügen Sie IO hinzu
quelle
J -
49 60 5551 BytesIch entschied mich für einen einfachen Ansatz. Die Funktion
t
findet die nächste Doppelprimzahl mit einer Primzahl als Eingabe (jetzt ist dies in derf
Funktion enthalten). Funktionf
findet die n-te Twin-Primzahl. Dies ist auch das erste Programm, das ich in J geschrieben habe.Beispiele:
Haben Sie nur für einige Augenbrauen die ungolfed Version.
Erläuterung:
quelle
C # 265
quelle
.Count(x=>j%x==0)==2)
->.Count(x=>j%x<1)<3)
P
anstelle vonProgram
und der Parametera
anstelle von aufgerufen werdenargs
.)
nach dem.Count(...)<3
. Sie können auch ein wenig sparen , indem Sievar i=int.Parse(args[0]);int f=0,c=0;
aufint i=int.Parse(args[0]),f=0,c=0;
. Sie können weitere speichern, indem Sie den Initialisierer aus der Schleife extrahieren, alsoc=0;for(int j=1;
=>c=0,j=1;for(;
.for
Schleife sowie mit einem vollständig qualifizierten Namen stattusing System
:using System.Linq;class P{static void Main(string[]args){int i=int.Parse(args[0]),f=0,c=0,j=1;for(;;j+=2)if(Enumerable.Range(1,j).Count(x=>j%x<1)>2)f=0;else if(f<1)f=j;else{if(++c==i){System.Console.WriteLine(f+", "+j);break;}j-=2;f=0;}}}
238 Zeichen.Ruby 94
Online-Test: http://ideone.com/B2wxnG
quelle
Perl,
10095Ungolfed:
quelle
T-SQL (2008+): 344
Brute erzwinge einen CTE, Primzahlen zu finden, Fensterfunktion, um n zu zählen, gefolgt von einem Join, um den Zwilling zu finden. Funktioniert in einer Sekunde für Ausgaben <1.000, knapp eine Minute für Ausgaben <10.000.
Golf (SQLFiddle hier ):
Lesbar:
quelle
GolfScript 46
Online-Test: Link
Kommentierter Code:
quelle
PHP 5.4, 223
Kein kleinerer, aber ein Versuch von PHP.
quelle
C 309
Erhält weiterhin die nächsten Primzahlen und speichert gerade und ungerade Terme und prüft dann, ob der Unterschied zwei ist.
quelle
for (int i=2;i*i<=k;i++)
R 91 Zeichen
Nichts wirklich ausgefallenes:
Verwendung:
quelle
Japt,
2319 Bytes-4 Bytes dank Shaggy
Führen Sie es online aus
quelle
JavaScript (Node.js), 162 Zeichen
Liest von stdin, gibt auf stdout aus und beendet "früh" für die Eingabe
<= 0
.Verwendung (Skript oben gespeichert als
ntp.js
):quelle
AWK - 129
Die Datei
fsoe-pairs.awk
:Laufen es:
(1. Zeile nach Eingabe des Befehls, die 2. Zeile wird ausgegeben)
Dies basiert auf einem eigenen Primgenerator-Algorithmus, den ich "Floating Sieve of Erastosthenes" nenne (bis ich ihn an anderer Stelle beschreibe), der nur den benötigten Teil des Siebs und die bereits berechneten Primzahlen speichert.
quelle
Python 2 (75)
Also, was ist hier los?
Schauen wir uns zunächst den Ausdruck an
all(n%i&~2for i in range(2,n-2))
, der prüft, ob(n-2,n)
es sich um ein Paar Doppelprimzahlen handelt.Der einfachere Ausdruck
all(n%i for i in range(2,n))
prüft einfach, obn
Primzahl vorliegt, indem er jeden Divisori
im Bereich ausprobiert2<=i<=n-1
und feststellt, ob alle Reste ungleich Null sind. Diesall
überprüft genau dies, da Python0
asFalse
und alle anderen Zahlen als behandeltTrue
.Beobachten Sie nun
(n-2)%i==0
genau das, wenn es sichn%i==2
um Teiler handelti>2
. So können wir die primality Überprüfung durchführenn
undn-2
zugleich durch die Reste für beide Überprüfung0
und2
. Das könnte so gemacht werdenall(n%i not in [0,2] for i in range(2,n-2))
. Wir versuchen nur Teilern im Bereich2<=i<=n-3
zum Wohlen-2
, aber das genügt fürn
auch dan-1
undn-2
nicht Teilern es sei denn , sein kannn<=4
. Wir werden nur ungeraden
beginnen5
, um diese Komplikation und die des Divisors zu vermeideni=2
.Wir spielen den Ausdruck
n%i not in [0,2]
in Golfn%i&~2
und erinnern uns, dass0
das falsch ist und andere Zahlen sindTrue
. Die Operator-Priorität(n%i)&(~2)
ist genau das, was benötigt wird. Das Bitkomplement~2
ist...11111101
, also bitweiseand
mit einer Zahl von Nullen, der2
binäre Platzwert des Bits . Dies gibt0
(dhFalse
) nur für0
und2
genau das, was wir wollen.Puh! Nun haben wir, dass der Ausdruck
all(n%i&~2for i in range(2,n-2))
prüft, obn
die obere Zahl eines Twin-Prim-Paares ist. Was bleibt, ist über sie zu iterieren, bis wirc
von ihnen sehen, woc
die eingegebene Zahl ist. Wir beginnen mit5
und zählen auf2
, um Teilerprobleme zu vermeiden. Wir dekrementierenc
jedes Maln
, wenn wir auf ein Problem stoßen , das funktioniert, und hören auf, wennc=0
. Schließlich drucken wir das Twin-Prim-Paar, mit dem wir enden.quelle
T-SQL (2012 +), 255 Zeichen
Ein kompakterer T-SQL Twin Prime Finder, der auch ein bisschen schneller wird.
Menschenlesbares Format ::
Der Grundgedanke ist, dass wir die eingebaute Zahlentabelle (master..spt_values type = 'p') und den Alias mit einem CTE als etwas Kurzes verwenden. Wir addieren 2, um die Sorge zu beseitigen, 0 oder 1 unbedeutende Fehler für unser Set zu ziehen, und haben nun Kandidaten von 2.2050.
Z Die innerste Abfrage erhält alle Primzahlen von 2 bis 2050, indem jede Zahl n herausgefiltert wird, die durch eine Zahl kleiner als n teilbar ist. Wir verwenden dann eine schicke T-SQL 2012 Windowing - Funktion ,
lag
die wir das vorherige Ergebnis ziehen läßt, so dass nun Zs Ergebnisse a und b die Primzahlen sindP[n]
undP[n-1]
jeweils. Die R-Abfrage erstellt die Ausgabezeichenfolge und filtert Nicht-Twin-Primzahlen sowie eine Folgenummer für die Ausgabe, die wir K nennen. Schließlich ermöglicht die letzte Abfrage R das Filtern und Abrufen der K-ten Twin-Primzahl durch Ändern ihrer Variablen.quelle
Mathematica - 71 Bytes
quelle