Das Finden von Primzahlen ist ein Programmierritus und sehr häufig ein erstes ernstes Programm, das jemand erstellt (normalerweise mit Testteilung).
Aber Primzahlen alleine sind schon abgenutzt. Weiter interessanter ist es, die ersten Lücken zu erhalten: die bislang längsten Lücken zwischen aufeinanderfolgenden Primzahlen. Diese sind ziemlich selten und "kostbar". Die ersten paar Paare und ihre Unterschiede sind:
2 3 1
3 5 2
7 11 4
23 29 6
89 97 8
113 127 14
...
Mein Vater hat diese Werte aus Spaß mit der Hand bis zu 10 km berechnet. Mal sehen, wie kurz ein Code sein kann.
Regeln:
- Keine eingebauten Funktionen für Prime Testing, Prime Generation oder Prime Gaps
- Kein Abrufen von http://oeis.org/A002386 oder ähnlichem (Ich kann Sie von weitem Betrüger riechen :))
- Keine vorberechneten Arrays
- Drucken Sie so lange, bis Ihr interner Integer-Typ nicht mehr funktioniert
Die niedrigste Anzahl an Charakteren gewinnt. +10 Zeichen, wenn Sie nur die Lücken ohne die Primzahlen drucken.
Sie können auch Versionen mit integrierten Funktionen anzeigen, wenn sie interessant sind. Seien Sie kreativ.
Klarstellung: Sie durchlaufen Primzahlen und melden jedes Mal, wenn Sie eine Lücke sehen, die größer ist als jede Lücke, die Sie zuvor gesehen haben. Beispielsweise ist zwischen 3 und 5 eine Lücke von 2 Einheiten vorhanden. Die Lücke zwischen 5 und 7 ist ebenfalls 2, aber das sind alte Nachrichten, die uns nicht mehr interessieren. Nur wenn Sie eine neue, größte Lücke sehen, melden Sie diese. Dies zeigt, wie die Primzahlen immer seltener werden, je größer die Lücken werden.
EDIT : Die meisten Antworten sind brillant und verdienen mehr Anerkennung. Bisher ist ein GolfScript-Eintrag mit 48 Zeichen jedoch der kürzeste.
Antworten:
GolfScript
6659574948Obwohl ich Probleme habe, es hier laufen zu lassen http://golfscript.apphb.com/ (vielleicht mag diese Site die Endlosschleife nicht?), Aber es funktioniert einwandfrei, wenn ich es auf meinem Computer mit golfscript.rb ausführe. Ich bin ziemlich neu in GolfScript, so dass dies wahrscheinlich noch weiter abgespielt werden kann. UPDATE: Ich denke nicht, dass man damit viel mehr Golf spielen kann, ohne den Algorithmus irgendwie zu ändern.
Die ersten paar Zeilen werden gedruckt (Wenn Sie das "", das gedruckt wird, nicht mögen, können Sie Folgendes hinzufügen:
Allgemeine, für Menschen lesbare Vorstellung davon, wie dies funktioniert (ein paar Dinge, die sich geringfügig unterscheiden, da ich in dieser Version keinen Stack verwende):
quelle
Python,
121110109108104103 ZeichenAls ich hier zum ersten Mal versuchte zu antworten, hoffe ich, dass ich es richtig gemacht habe. Ich bin nicht sicher, ob ich die Zeichen richtig gezählt habe.
Hmmm, ich konnte ein anderes Zeichen auf dem Ausdruck speichern, indem ich auf Python 2.x heruntergestuft habe ...
quelle
#
, du zählst die Zeichen nicht ernsthaft von Hand, oder? javascriptkit.com/script/script2/charcount.shtmlif all(n%x>0for x in p):
ist ein bisschen kürzer. Sie können auch einige Zeichen speichern, indem Sie Anweisungen in dieselbe Zeile verschieben (za=1;b=2;f()
. B. ).JavaScript,
90857874 ZeichenFunktionscode (Google Closure Compiler - Erweiterte Optimierungen; einige manuelle Bearbeitungen; weitere Bearbeitungen von @ MT0 )
Langer Code
Ausgabe
Ziemlich ineffizienter Test für Primzahlen, aber auf diese Weise werden weniger Zeichen verwendet.
Erster Beitrag hier, bitte entschuldigen Sie eventuelle Fehler.
quelle
for(a=b=2,c=0;b++;){for(d=b;b%--d;);1==d&&(c<b-a&&console.log(a,b,c=b-a),a=b)}
for(a=b=2,c=0;b++;)for(d=b;b%--d;)d<3&&(c<b-a&&console.log(a,b,c=b-a),a=b)
Mathematica,
114,108Ermöglicht die unendliche Ausgabe, obwohl sich der Lüfter nach einem bestimmten Zeitpunkt in der Sequenz dreht und Sie den Verdacht haben, dass Ihre CPU Freecell spielt, während Sie ihr Bestes tun, um ausgelastet auszusehen.
Ausgabebeispiel (Dies sind diejenigen, die es in den ersten ~ 30er Jahren aufgreift):
Ungolfed-Code:
quelle
≠
?Haskell -
122116114112110(Ineffizienter) Ausdruck einer Primliste, der Will Ness gestohlen wurde .
-edit- Ich wusste nie,
x|y=z|w=q
dass es gültig sein würde.quelle
MATLAB
10489Implementieren Sie einfach die grundlegende Methode, indem Sie jede mögliche Unterteilung überprüfen.
Ausgabe:
quelle
octave
und dasinf
Ding funktioniert nicht (und der Druck wird verschoben, bis die Schleife endet). Hat matlab eine Lazy Range Evaluation?76 Zeichen, Dogelang
Konvertiert von meiner Python-Version :
Ausgabe:
quelle
Golfscript,
595150 ZeichenMann, jeder Charakter ist extrem schwer zu verlieren:
Ausgabe :
Erklärung :
Der Stapel wird so eingerichtet, dass jede Iteration mit dem Stapel wie diesem beginnt, wobei sich der obere Teil rechts befindet. Das
[
zeigt die aktuelle Array-Markierung an, dh, wenn der Interpreter auf ein trifft]
, wird alles auf dem Stapel von der Markierung bis zur Spitze in ein Array eingefügt.g
ist die maximale Lücke bisher. Von oben nach unten:In der Schleife:
Wie werden alle Teiler in eine Liste aufgenommen? Lass es uns Schritt für Schritt machen
Was macht es, wenn die Teiler leer sind?
Zwei Wege: ja und nein. Wenn ja (beachten Sie, dass
if
der oberste Wert auf dem Stapel verbraucht wird):Wenn nein:
Beachten Sie in beiden Fällen, dass sich unser Stapel jetzt in der Form befindet
... | g [ c | c | c
.Jetzt wird der
do
Spitzenwert immer vom Stapel genommenc
und es wird eine Schleife ausgeführt, wenn er positiv ist. Da diesc
immer weiter zunimmt, ist es immer wahr, so dass wir für immer eine Schleife bilden.Nach dem Auftauchen befindet sich der obere Bereich des Stapels
g [ c | c
, was bedeutet, dass der letzte aktualisiert wurdec
und die Array-Markierung befindet sich an derselben Stelleg
befindet sich immer noch dort, wo wir dies erwarten.Dies sind die verschlungenen Operationen von GolfScript. Ich hoffe, Sie haben es genossen, mitzufolgen!
quelle
Rubin, 110
Nur für Ruby 2.0 aufgrund der
lazy
Methode:Ausgabe:
quelle
Perl, 105 Bytes
Ungolfed:
Der Algorithmus ist einfach,
$p
merkt sich die vorherige Primzahl. Dann$i
geht es von3
oben nach unten, wenn der Typ $ i bei mir "versagt" oder wegen Überlauf negativ wird.$i
wird auf grobe Weise getestet, indem alle Teiler von 2 bis 5 überprüft werden$i-1
. Eine Zeile wird gedruckt, wenn die aktuelle Differenz größer ist als die zuvor gedruckte Differenz$d
.Mit etwas mehr Bytes kann die Laufzeit verbessert werden:
Das Ergebnis beginnt mit:
quelle
Python,
9391 ZeichenNaive Prime-Prüfung (überprüfen Sie, ob durch irgendetwas von 2 bis
n
(weniger Zeichen als bisn/2
) teilbar ):Die zweite Ebene des Einzugs ist ein Tabulatorzeichen.
Ausgabe:
quelle
n
nur Checks bisn-1
Bash und etwas Perl für Prime Regex (
167 157 143112 Bytes)etwas Output:
quelle
test
protestiert jedoch ziemlich viel und es funktioniert bei mir nicht. Sie könnten auch einige benutzenlet n++
undlet f=c-p
ersetzentest
mit[
. Oder testen(())
Sie möglicherweise, wo Sie keine$
Leerzeichen benötigen .test -n $d
Für eine leere Zeichenfolge wird true zurückgegeben.test -n "$d"
war in Ordnung, aber länger. Auf der Manpage steht jedoch, dass -n optional ist, und es stellte sich heraus, dass diestest $d
in Ordnung war. Und deshalb[ $d ]
auch. Und g = 0 musste initialisiert werden.Perl
9590 Bytesalte Non Golf Version:
Dies ähnelt meiner anderen Einreichung, sans bash.
quelle
for($n=$c=2;$p=$c;$c-$p>$g&&printf"$p $c %d\n",$g=$c-$p){$c=$n if(1x++$n)!~/^(11+?)\1+$/}
C (100)
Mein eigener Beitrag, kein spezieller Algorithmus, nur Golf:
quelle
r
undp
Sie werden weniger Zeichen haben und den Bonus punkten :)Haskell, 134C
Golf gespielt:
Ungolfed:
quelle
C:
493302272246Ich habe die Rekursion nicht die übliche Schleife von
for
oder verwendetwhile
.Ausgabe:
quelle
leaking
an der Spitze, da Sie nicht isPrime (n2) testen, sondern Primzahlen zwischen n1 und n2 zulassen. Und das kann nicht wirklich behoben werden, weil man n2 nicht erhöhen kann, ohne die Primzahlen zu treffen.return
In main überspringen . Überspringe den letztenelse
. Ersetzen Sie&&
->&
undnum%i==0
mitnum%i<1
. Und nach den alten c-Standards (es wird Warnungen geben) müssen Sie keine Rückgabewerte für void- und int-Funktionen angeben (ihre Argumente sind ebenfalls standardmäßig int).int
reduziert , mit einem einzigen bedingungslosen rekursiven Aufruf, nur einem Typspezifizierer ( ) und einer stark reduzierten Primetestfunktion:e(j,i){while(j%++i);return i==j;}f(a,b,c){int A=e(a,1),B=e(b,1);if(A&B&&c<b-a)printf("%d %d %d\n",a,b,c=b-a);f(a+(B|!A),b+(A|!B),c);}main(){f(2,3,0);}
Oracle SQL,
216202196172 + 10 = 182Habe das gerade in der Frage gemerkt:
Da dies SQL ist und die Schlüsselwörter so lang sind, ist es eigentlich besser, die Strafe in Kauf zu nehmen. Es ist die gleiche Idee wie beim Original.
das ist schön zu:
Alte Antwort (196)
und in einem lesbaren Format:
Dies erzeugt einen Zahlengenerator in
c
, die innerste Unterauswahl erzeugt die Primzahlen unter Verwendung eines Siebs von Eratosthenes, die äußere berechnet die vorherige Primzahl und schließlich subtrahiert die letzte Auswahl eine von der anderen.Dies gibt nichts zurück, da 1 x 10 124 rekursive Abfragen ausgeführt werden. Wenn Sie also möchten, dass es funktioniert, verringern Sie diese Zahl auf etwas Sinnvolles.
quelle
D - 153 + 10 = 163
Ich nehme hier gerne die 10-Punkte-Strafe in Kauf, weil die Zeichenanzahl immer noch niedriger ist als wenn ich auch die Primzahlen gedruckt hätte.
Golf gespielt :
Lesbare Version :
quelle
JAVASCRIPT 174 CHAR
kurze Version:
quelle
Javascript 138
Kopieren Sie diesen Code in Ihre Browserkonsole. Es wird für immer bleiben, da die maximale Anzahl etwas ist
1.79*10^308
.Ungolfed:
quelle
C #
162161 Zeichen151 Zeichen + 10 Strafzeichen = 161 Zeichen
Kurzfassung:
Lange Version:
Es war eigentlich besser, 10 Zeichen Strafe zu nehmen, da es kürzer ist
g
(11 Zeichen mit Strafe) alsp+" "+i+" "+g
(13 Zeichen ohne Strafe).quelle
Ruby
90868483 ZeichenEinige boolesche Kurzschlüsse, Missbrauch der Ausdrucksbewertung usw.
quelle
C 248
Der Code vergleicht aufeinanderfolgende Primzahlen a, b und prüft dann, ob die Lücken größer als g sind. Dann findet er das nächste Primzahlenpaar.
quelle
Haskell,
154 144 137123Die Primzahlen
p
werden mit dem Erasthotensieb erzeugt#
und anschließend mit filtriert und gedruckt%
.Die Ausgabe sieht aus wie
was ich hoffe ist okay
quelle
Game Maker Language, 85
Angenommen, alle nicht initialisierten Variablen sind wie
0
folgt (dies ist bei einigen Versionen von Game Maker die Standardeinstellung).quelle
Game Maker Language, 74 + 55 = 129
Angenommen, alle nicht initialisierten Variablen sind wie
0
folgt (dies ist bei einigen Versionen von Game Maker die Standardeinstellung).Skript
p
ist unten:quelle
Perl, 87 Bytes ( mit einem Modul )
Ich habe das Modul geschrieben, aber wir müssten der Liste zusätzliche 565.000 Zeichen hinzufügen. Meistens aus Spaß, aber auch um eine Leistungsalternative anzubieten, da ich bisher keine Verwendung von Builtins sehe. 4,6s für Lücken bis 1e9, 36s für Lücken bis 1e10, 6,5min für 1e11.
Pari / GP 2.8 kann im Prinzip auf die gleiche Weise ausgeführt werden, allerdings über 2x langsamer:
quelle
Perl 153
Kurzcode:
leicht zu lesen:
quelle