GolfScript, 22/20 (20/19) bayt
n(6?,:|2>{(.p|%-.}do:n
Hız pahasına, kod iki bayt daha kısa yapılabilir:
n(6?,:|2>.{|%2>-}/n*
Düzenlenen soruda belirtilen çıktı formatı göz ardı edilirse (mevcut cevapların çoğu budur), hızlı sürümde iki bayt kaydedilebilir ve yavaş olana bir tanesi kaydedilebilir:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
Bu, hızlı sürüm için hazırlayıcılardan sonra ek bir LF yazdıracak ve hazırlıkları yavaş olan için bir dizi olarak yazacaktır.
Nasıl çalışır
Her iki versiyon da , Eratosthenes elek uygulamalarıdır .
Hızlı versiyon aşağıdakileri yapar:
Set A = [ 2 3 4 … 999,999 ]
ve | = [ 0 1 2 … 999,999 ]
.
Ayarla N = A[0]
ve yazdır N
.
Her n'ninci elemanı toplamak |
içinde C
. Bunlar katları N
.
Set A = A - C
.
A
Boş değilse , 2'ye geri dönün.
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.
Yavaş versiyon benzer şekilde çalışır, ancak “A” minimum katlarını (her zaman asal olan) art arda kaldırmak yerine, 1.000.000'in altındaki tüm pozitif tamsayıların katlarını kaldırır.
Rekabet
İlkelliği çarpanlara ayırmak ya da kontrol etmek için herhangi bir yerleşik matematiksel işlev yoksa, tüm GolfScript çözümleri ya çok büyük ya da çok verimsiz olacaktır.
Hala verimli olmaktan uzak olsa da, iyi bir hız / boyut oranına ulaştığımı düşünüyorum. Sunulduğu tarihte, bu yaklaşım, yukarıda belirtilen yerleşiklerin hiçbirini kullanmayanların en kısa olduğu görülmektedir. Diyorum görünüyor ben bazı yanıtlar nasıl çalıştığını hiçbir fikrim yok çünkü ...
Gönderilen dört GolfScript çözümünün hepsini kıyaslamıştım: w0lf's (deneme bölümü), diğer cevabım (Wilson teoremi) ve bu cevabın ikisi. Sonuçlar bunlardı:
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)