GolfScript, 22/20 (20/19) byte
n(6?,:|2>{(.p|%-.}do:n
A scapito della velocità, il codice può essere ridotto di due byte:
n(6?,:|2>.{|%2>-}/n*
Se il formato di output specificato nella domanda modificata viene ignorato (che è ciò che fanno molte delle risposte esistenti), due byte possono essere salvati nella versione veloce e uno può essere salvato in quella lenta:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Questo stamperà un ulteriore LF dopo i numeri primi per la versione veloce e stamperà i numeri primi come un array per quello lento.
Come funziona
Entrambe le versioni sono implementazioni del setaccio di Eratostene .
La versione veloce effettua le seguenti operazioni:
Imposta A = [ 2 3 4 … 999,999 ]
e | = [ 0 1 2 … 999,999 ]
.
Imposta N = A[0]
e stampa N
.
Raccogli tutti gli elementi dell'N-esimo da |
dentro C
. Questi sono i multipli di N
.
Set A = A - C
.
Se A
non è vuoto, tornare a 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.
La versione lenta funziona in modo simile, ma invece di rimuovere successivamente multipli del minimo di "A" (che è sempre primo), rimuove i multipli di tutti gli interi positivi inferiori a 1.000.000.
Competitività
In assenza di funzioni matematiche integrate per la fattorizzazione o il controllo della primalità, tutte le soluzioni GolfScript saranno molto grandi o molto inefficienti.
Pur essendo tutt'altro che efficiente, penso di aver raggiunto un discreto rapporto velocità-dimensioni. Al momento della sua presentazione, questo approccio sembra essere il più breve di quelli che non utilizzano nessuno dei summenzionati incorporati. Dico sembra perché non ho idea di come funzionano alcune delle risposte ...
Ho analizzato tutte e quattro le soluzioni GolfScript presentate: w0lf (divisione di prova), l'altra mia risposta (teorema di Wilson) e le due di questa risposta. Questi erano i risultati:
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)