GolfScript, 22/20 (20/19) byte
n(6?,:|2>{(.p|%-.}do:n
Với chi phí tốc độ, mã có thể được thực hiện ngắn hơn hai byte:
n(6?,:|2>.{|%2>-}/n*
Nếu định dạng đầu ra được chỉ định trong câu hỏi đã chỉnh sửa bị bỏ qua (đó là điều mà nhiều câu trả lời hiện có làm được), hai byte có thể được lưu trong phiên bản nhanh và một có thể được lưu ở dạng chậm:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Điều này sẽ in một số bổ sung sau các số nguyên tố cho phiên bản nhanh và nó sẽ in các số nguyên tố dưới dạng một mảng cho số chậm.
Làm thế nào nó hoạt động
Cả hai phiên bản đều được triển khai sàng của Eratosthenes .
Phiên bản nhanh thực hiện như sau:
Đặt A = [ 2 3 4 … 999,999 ]
và | = [ 0 1 2 … 999,999 ]
.
Đặt N = A[0]
và in N
.
Thu thập mọi phần tử N-th từ |
trong C
. Đây là bội số của N
.
Đặt A = A - C
.
Nếu A
không trống, quay lại 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.
Phiên bản chậm hoạt động theo kiểu tương tự, nhưng thay vì loại bỏ liên tiếp các bội số tối thiểu của CÂU (luôn luôn là số nguyên tố), nó sẽ loại bỏ bội số của tất cả các số nguyên dương dưới 1.000.000.
Năng lực cạnh tranh
Trong trường hợp không có bất kỳ hàm toán học tích hợp nào để xác định hoặc kiểm tra tính nguyên thủy, tất cả các giải pháp GolfScript sẽ rất lớn hoặc rất kém hiệu quả.
Mặc dù vẫn còn xa hiệu quả, tôi nghĩ rằng tôi đã đạt được tỷ lệ tốc độ trên kích thước khá. Tại thời điểm đệ trình, phương pháp này dường như là cách ngắn nhất trong số những phương pháp không sử dụng bất kỳ nội dung nào được nói ở trên. Tôi nói dường như bởi vì tôi không biết làm thế nào một số câu trả lời hoạt động ...
Tôi đã điểm chuẩn tất cả bốn giải pháp GolfScript đã gửi: w0lf's (bộ phận dùng thử), câu trả lời khác của tôi (định lý của Wilson) và hai câu trả lời này. Đây là kết quả:
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)