গল্ফস্ক্রিপ্ট, 22/20 (20/19) বাইট
n(6?,:|2>{(.p|%-.}do:n
গতির ব্যয়ে, কোডটি দুটি বাইটকে খাটো করা যায়:
n(6?,:|2>.{|%2>-}/n*
যদি সম্পাদিত প্রশ্নে উল্লিখিত আউটপুট ফর্ম্যাটটিকে যদি অবহেলা করা হয় (যা বিদ্যমান উত্তরগুলির বেশিরভাগই তাই করে), দুটি বাইট দ্রুত সংস্করণে সংরক্ষণ করা যায় এবং একটি ধীর ধীরে সংরক্ষণ করা যায়:
n(6?,:|2>{(.p|%-.}do
n(6?,:|2>.{|%2>-}/`
এটি দ্রুত সংস্করণের জন্য প্রাইমগুলির পরে একটি অতিরিক্ত এলএফ মুদ্রণ করবে এবং এটি প্রাইমগুলি ধীর সংস্করণের জন্য অ্যারে হিসাবে মুদ্রণ করবে।
কিভাবে এটা কাজ করে
উভয় সংস্করণ হ'ল ইরোটোস্টিনিসের চালনী কার্যকরকরণ ।
দ্রুত সংস্করণ নিম্নলিখিতগুলি করে:
সেট A = [ 2 3 4 … 999,999 ]
এবং | = [ 0 1 2 … 999,999 ]
।
সেট N = A[0]
এবং মুদ্রণ N
।
থেকে 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.
ধীর সংস্করণটি একই ধরণের কাজ করে, তবে সর্বনিম্ন "এ" (যা সর্বদা প্রধান) এর গুণকগুলি সরিয়ে দেওয়ার পরিবর্তে এটি সমস্ত ধনাত্মক পূর্ণসংখ্যকে এক হাজারের নীচে সরিয়ে দেয়।
প্রতিযোগিতামূলক
প্রাথমিকতা পরীক্ষা করতে বা পরীক্ষা করার জন্য কোনও অন্তর্নির্মিত গাণিতিক ক্রিয়াকলাপের অভাবে, সমস্ত গল্ফস্ক্রিপ্ট সমাধানগুলি খুব বড় বা খুব অকার্যকর হবে।
দক্ষ হওয়ার থেকে এখনও দূরে থাকা অবস্থায়, আমি মনে করি আমি একটি শালীন গতি থেকে আকারের অনুপাত অর্জন করেছি। জমা দেওয়ার সময়, এই পদ্ধতির সংক্ষিপ্ততম মনে হয় যারা পূর্বোক্ত বিল্ট-ইনগুলির কোনও ব্যবহার করে না। আমি বলেছি বলে মনে হচ্ছে কারণ উত্তরগুলির কয়েকটি কীভাবে কাজ করে তা আমার কোনও ধারণা নেই ...
আমি চারটি জমা দেওয়া গল্ফস্ক্রিপ্ট সমাধানগুলি বেঞ্চমার্ক করেছি: ডাব্লুফিল্ফের (ট্রায়াল বিভাগ), আমার অন্য উত্তর (উইলসনের উপপাদ্য) এবং এই উত্তর দুটি। এই ফলাফল ছিল:
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)