Die Herausforderung
Implementieren Sie das Sundaram-Sieb, um die Primzahlen unten zu finden n
. Nehmen Sie eine Ganzzahl n
und geben Sie die folgenden Primzahlen aus n
. Sie können davon ausgehen, dass dies n
immer weniger als oder gleich einer Million sein wird.
Sieb
Beginnen Sie mit einer Liste der Ganzzahlen von
1
bisn
.Entfernen Sie alle Zahlen in dem Formular,
i + j + 2ij
in dem:i
undj
sind kleiner alsn
.j
ist immer größer als oder gleichi
, was größer als oder gleich ist1
.i + j + 2ij
ist kleiner oder gleichn
Multiplizieren Sie die verbleibenden Zahlen mit
2
und addieren Sie1
.
Dies ergibt alle Primzahlen (mit Ausnahme derjenigen 2
, die in Ihrer Ausgabe enthalten sein sollten) kleiner als 2n + 2
.
Hier ist eine Animation des Siebs, mit dem die Primzahlen unten ermittelt werden 202
.
Ausgabe
Ihre Ausgabe sollte jede Primzahl ≤ n
(in aufsteigender Reihenfolge) sein, gefolgt von einer neuen Zeile:
2
3
5
Wo n
ist 5
.
Beispiele
> 10
2
3
5
7
> 30
2
3
5
7
11
13
17
19
23
29
Eingänge sind mit gekennzeichnet >
.
n=30
fehlt 29 in der Ausgabe.(i,j)
miti<=j
, aber das Ergebnis ändert sich nicht, wenn wir diese Anforderung ignorieren. Können wir das tun, um Bytes zu sparen?i <= j
. Es ist nur ein Teil der Funktionsweise des Siebs. Also ja, Sie können dasi <= j
in Ihrem Code weglassen. @xnor2n+1
) , die nicht von der Form ist2(i + j + 2ij)+1
- können wir dieses Objekt direkt über die möglichen Primzahlen testen oder auch unseren Code haben die mal 2 plus 1 an einem gewissen Punkt zu tun ?n
in der ganzen Sache steckt. In der Methodenbeschreibung wird angegeben, dass alle Primzahlen bis generiert werden2 * n + 2
. In der Eingabe- / Ausgabebeschreibung heißt es jedoch, dass die Eingaben
und die Ausgabe alle Primzahlen sindn
. Sollen wir also die Methode anwenden, um alle Primzahlen bis zu zu generieren2 * n + 2
und dann diejenigen fallen zu lassen, die größer sind alsn
für die Ausgabe? Oder sollen wir dasn
in der Methodenbeschreibung aus der Eingabe berechnenn
?Antworten:
Pyth, 23 Bytes
Demonstration
Implementiert den Algorithmus einfach wie angegeben.
quelle
Haskell,
9390 BytesSo funktioniert es:
[i+j+2*i*j|j<-r,i<-r]
Sind allei+j+2ij
die entfernt werden (\\
) aus[1..n]
. Skaliere zu2x+1
und verwandle sie in einen String (show
). Join with NL (unlines
).quelle
Scala,
115 124 122 115114 BytesEine anonyme Funktion; Nimmt n als Argument und gibt das Ergebnis an stdout aus.
quelle
JavaScript (ES7),
107 -105 ByteDas Array-Verständnis ist fantastisch! Aber ich frage mich, warum JS keine Bereichssyntax hat (zB
[1..n]
) ...Dies wurde erfolgreich in Firefox 40 getestet. Aufschlüsselung:
Alternative, ES6-freundliche Lösung (111 Bytes):
Vorschläge willkommen!
quelle
MATLAB, 98
Und in lesbarer Form
quelle
Java8:
168165 BytesFür eine größere Anzahl kann ein Datentyp mit großem Bereich verwendet werden. Es ist nicht ausreichend, ganze
N
Indizes zu iterierenN/2
.Richtig zu verstehen, ist die äquivalente Methode.
quelle
N>=2
->N>1
?A[i]==0
->A[i]<1
?CJam, 35 Bytes
Probieren Sie es online aus
Dies scheint im Vergleich zu isaacgs Pyth-Lösung etwas langwierig zu sein, aber es ist ... was ich habe.
Erläuterung:
quelle
Perl 6 , 96 Bytes
Wenn ich mich strikt an die Beschreibung halte, ist der kürzeste, den ich bekommen habe, 96 Bytes.
Wenn ich die
2n + 1
on-Initialisierung des Arrays durchführen könnte, das vorab einfügen2
und das auf nur die Werte begrenzen könnte, die kleiner oder gleich sindn
; es kann auf 84 Bytes reduziert werden.Wenn ich das
j
zumindest auch ignoriere,i
kann ich es auf 82 Bytes reduzieren.Beispielverwendung:
quelle
PHP, 126 Bytes
Online Version
quelle
Julia 0,6 , 65 Bytes
Probieren Sie es online!
Keine große Herausforderung beim Golfen, aber ich musste es nur für den Namen tun. :)
quelle