गोल्फस्क्रिप्ट, 22/20 (20/19) बाइट्स
n(6?,:|2>{(.p|%-.}do:n
गति की लागत पर, कोड को दो बाइट्स कम किया जा सकता है:
n(6?,:|2>.{|%2>-}/n*
यदि संपादित प्रश्न में निर्दिष्ट आउटपुट स्वरूप की अवहेलना की जाती है (जो कि मौजूदा उत्तरों में से कई करते हैं), दो बाइट्स को तेज संस्करण में सहेजा जा सकता है और एक को धीमी गति से बचाया जा सकता है:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
यह तेजी से संस्करण के लिए primes के बाद एक अतिरिक्त LF मुद्रित करेगा, और यह धीमी गति के लिए एक सरणी के रूप में primes मुद्रित करेगा।
यह काम किस प्रकार करता है
दोनों संस्करण एराटोस्थनीज की छलनी के कार्यान्वयन हैं ।
तेज़ संस्करण निम्न कार्य करता है:
सेट A = [ 2 3 4 … 999,999 ]
और | = [ 0 1 2 … 999,999 ]
।
सेट करें N = A[0]
और प्रिंट करें N
।
से हर एन वें तत्व इकट्ठा |
में C
। ये कई गुना हैं N
।
सेट करें A = A - C
।
यदि 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.
धीमे संस्करण समान शैली में काम करता है, लेकिन क्रमिक रूप से "ए" के न्यूनतम के गुणकों को हटाने के बजाय (जो हमेशा प्रमुख होता है), यह 1,000,000 से नीचे के सभी सकारात्मक पूर्णांक के गुणकों को हटा देता है।
प्रतिस्पर्धा
किसी भी अंतर्निहित गणितीय कार्यों की अनुपस्थिति में, गवाही के लिए कारक या जांच करने के लिए, सभी गोल्फस्क्रिप्ट समाधान या तो बहुत बड़े या बहुत अक्षम होंगे।
हालांकि अभी भी कुशल होने से, मुझे लगता है कि मैंने एक अच्छा गति-से-आकार अनुपात प्राप्त किया है। इसकी सबमिशन के समय, यह दृष्टिकोण उन लोगों में सबसे छोटा लगता है जो किसी भी निर्मित पूर्व-इन्स का उपयोग नहीं करते हैं। मैं कहता हूँ लगता है क्योंकि मुझे पता नहीं कैसे कुछ उत्तर काम है ...
मैंने सभी चार सबमिट किए गए गोल्फस्क्रिप्ट समाधानों को बेंचमार्क किया है: w0lf's (ट्रायल डिवीजन), मेरे अन्य उत्तर (विल्सन प्रमेय) और इस उत्तर के दो। ये परिणाम थे:
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)