GolfScript, 22/20 (20/19) Bytes
n(6?,:|2>{(.p|%-.}do:n
Auf Kosten der Geschwindigkeit kann der Code zwei Bytes kürzer gemacht werden:
n(6?,:|2>.{|%2>-}/n*
Wenn das in der bearbeiteten Frage angegebene Ausgabeformat nicht beachtet wird (wie viele der vorhandenen Antworten), können zwei Bytes in der schnellen und eines in der langsamen Version gespeichert werden:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Dadurch wird nach den Primzahlen für die schnelle Version eine zusätzliche LF ausgegeben, und die Primzahlen werden als Array für die langsame Version gedruckt.
Wie es funktioniert
Beide Versionen sind Implementierungen des Siebs von Eratosthenes .
Die schnelle Version macht folgendes:
Stellen Sie A = [ 2 3 4 … 999,999 ]
und ein| = [ 0 1 2 … 999,999 ]
.
Einstellen N = A[0]
und druckenN
.
Sammle jedes N-te Element von |
in C
. Dies sind die Vielfachen vonN
.
einstellen A = A - C
.
Wenn A
es nicht leer ist, gehe zurück zu 2.
n(6? # Push "\n".pop() ** 6 = 1,000,000.
,:| # Push | = [ 0 1 2 … 999,999 ].
,2> # Push A = [ 2 3 4 … 999,999 ].
{ #
( # Unshift the first element (“N”) of “A”.
.p # Print “N”.
|% # Collect every N-th element from “A” into a new array, starting with the first.
- # Take the set difference of “A” and the array from above.
. # Duplicate the set difference.
}do # If the set difference is non-empty, repeat.
:n # Store the empty string in “n”, so no final LF will get printed.
Die langsame Version funktioniert auf ähnliche Weise, aber anstatt nacheinander ein Vielfaches des Minimums von „A“ (das immer eine Primzahl ist) zu entfernen, werden ein Vielfaches aller positiven Ganzzahlen unter 1.000.000 entfernt.
Wettbewerbsfähigkeit
Ohne eingebaute mathematische Funktionen zur Faktorisierung oder Überprüfung der Primalität sind alle GolfScript-Lösungen entweder sehr umfangreich oder sehr ineffizient.
Ich bin zwar noch weit davon entfernt, effizient zu sein, aber ich denke, ich habe ein anständiges Verhältnis von Geschwindigkeit zu Größe erreicht. Zum Zeitpunkt der Übermittlung scheint dieser Ansatz der kürzeste zu sein, der keine der oben genannten integrierten Funktionen verwendet. Ich sage scheint, weil ich keine Ahnung habe, wie einige der Antworten funktionieren ...
Ich habe alle vier eingereichten GolfScript-Lösungen verglichen: w0lfs (Versuchsabteilung), meine andere Antwort (Wilsons Theorem) und die beiden dieser Antworten. Das waren die Ergebnisse:
Bound | Trial division | Sieve (slow) | Wilson's theorem | Sieve (fast)
----------+--------------------+--------------------+------------------+----------------
1,000 | 2.47 s | 0.06 s | 0.03 s | 0.03 s
10,000 | 246.06 s (4.1 m) | 1.49 s | 0.38 s | 0.14 s
20,000 | 1006.83 s (16.8 m) | 5.22 s | 1.41 s | 0.38 s
100,000 | ~ 7 h (estimated) | 104.65 (1.7 m) | 35.20 s | 5.82 s
1,000,000 | ~ 29 d (estimated) | 111136.97s (3.1 h) | 3695.92 s (1 h) | 418.24 s (7 m)