GolfScript, 22/20 (20/19) byte
n(6?,:|2>{(.p|%-.}do:n
Dengan mengorbankan kecepatan, kode dapat dibuat dua byte lebih pendek:
n(6?,:|2>.{|%2>-}/n*
Jika format output yang ditentukan dalam pertanyaan yang diedit diabaikan (yang merupakan jawaban dari banyak jawaban yang ada), dua byte dapat disimpan dalam versi cepat dan satu dapat disimpan dalam versi lambat:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Ini akan mencetak LF tambahan setelah bilangan prima untuk versi cepat, dan itu akan mencetak bilangan prima sebagai larik untuk yang lambat.
Bagaimana itu bekerja
Kedua versi ini merupakan implementasi dari saringan Eratosthenes .
Versi cepat melakukan hal berikut:
Atur A = [ 2 3 4 … 999,999 ]
dan | = [ 0 1 2 … 999,999 ]
.
Atur N = A[0]
dan cetak N
.
Kumpulkan setiap elemen ke-N dari |
dalam C
. Ini adalah kelipatan dari N
.
Setel A = A - C
.
Jika A
tidak kosong, kembali ke 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.
Versi lambat bekerja dengan cara yang sama, tetapi alih-alih menghapus kelipatan minimum "A" (yang selalu prima), ia menghapus kelipatan semua bilangan bulat positif di bawah 1.000.000.
Daya saing
Dengan tidak adanya fungsi matematika bawaan untuk memfaktisasi atau memeriksa primality, semua solusi GolfScript akan sangat besar atau sangat tidak efisien.
Meskipun masih jauh dari efisien, saya pikir saya telah mencapai rasio kecepatan-ke-ukuran yang layak. Pada saat pengajuannya, pendekatan ini tampaknya menjadi yang terpendek dari mereka yang tidak menggunakan salah satu built-in yang disebutkan di atas. Saya katakan sepertinya karena saya tidak tahu bagaimana beberapa jawaban bekerja ...
Saya telah membandingkan keempat solusi GolfScript yang diajukan: w0lf's (divisi percobaan), jawaban saya yang lain (teorema Wilson) dan dua jawaban ini. Inilah hasilnya:
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)