এটি কখন একটি কোড গল্ফ হয়ে উঠল? আমি ভেবেছিলাম সেরা অ্যালগরিদম নিয়ে আসা একটি কোড চ্যালেঞ্জ!
কোড-গলফ
এপিএল, 33 টি অক্ষর
{r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6}
এই একটি সহজ রৈখিক অনুসন্ধান = 1 + + 10 C থেকে শুরু -6 ও 10 দ্বারা এটি বৃদ্ধিশীল -6 পর্যন্ত
লগ সি লগ সি লগ ইন করুন সি ⋯ একটি ≤ 1
যেখানে লগ সি ফাংশন যাও recursively বি বার প্রয়োগ করা হয়।
উদাহরণ
4 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 65536
2.0000009999177335
3 {r←⍵⋄⍺{1≥⍵⍟⍣⍺⊢r:⍵⋄⍺∇⍵+i}1+i←1e¯6} 7625597484987
3.0000000000575113
এই কোডটি খুব ধীর, তবে 2 বা 3 এর মতো ছোট বেসগুলির জন্য এটি কয়েক সেকেন্ডে সম্পূর্ণ হয়। আরও ভাল জিনিসের জন্য নীচে দেখুন।
কোড-চ্যালেঞ্জ
এপিএল, লগারিদমিক জটিলতা
মূল শৃঙ্খলায় প্রকৃতপক্ষে রৈখিক জটিলতা, ফলাফলের আকার এবং যথার্থতার উপর লোগারিথমিক:
সময় = ও (বি × লগ (সি) + বি × লগ (ডি))
যেখানে বি মূল ক্রম, সি হল টিটারেশন বেসটি জিজ্ঞাসা করা হচ্ছে, এবং ডি হ'ল যথার্থতার সংখ্যার সংখ্যা। এই জটিলতাটি আমার স্বজ্ঞাত বোধগম্যতা, আমি কোনও প্রামাণিক প্রমাণ প্রমান করিনি।
এই অ্যালগরিদমের জন্য বড় পূর্ণসংখ্যার প্রয়োজন হয় না, এটি কেবল নিয়মিত ভাসমান পয়েন্ট সংখ্যাগুলিতে লগ ফাংশনটি ব্যবহার করে, সুতরাং এটি ভাসমান পয়েন্ট বাস্তবায়নের সীমা অবধি (ডাবল যথার্থতা, বা স্বতঃস্ফূর্ত বৃহত এফপি সংখ্যার উপর নির্ভর করে) এপিএল বাস্তবায়ন যা তাদের প্রস্তাব দেয়))
ফলাফলের নির্ভুলতা ⎕CT
কাঙ্ক্ষিত গ্রহণযোগ্য ত্রুটির সাথে তুলনা (তুলনা সহনশীলতা) দ্বারা নিয়ন্ত্রণ করা যেতে পারে (আমার সিস্টেমে এটি ডিফল্ট 1e¯14, প্রায় 14 দশমিক অঙ্ক)
sroot←{ ⍝ Compute the ⍺-th order super-root of ⍵:
n←⍺ ⋄ r←⍵ ⍝ n is the order, r is the result of the tetration.
u←{ ⍝ Compute u, the upper bound, a base ≥ the expected result:
1≥⍵⍟⍣n⊢r:⍵ ⍝ apply ⍵⍟ (log base ⍵) n times; if ≤1 then upper bound found
∇2×⍵ ⍝ otherwise double the base and recurse
}2 ⍝ start the search with ⍵=2 as a first guess.
(u÷2){ ⍝ Perform a binary search (bisection) to refine the base:
b←(⍺+⍵)÷2 ⍝ b is the middle point between ⍺ and ⍵
t←b⍟⍣n⊢r ⍝ t is the result of applying b⍟ n times, starting with r;
t=1:b ⍝ if t=1 (under ⎕CT), then b is the super-root wanted;
t<1:⍺∇b ⍝ if t<1, recurse between ⍺ and b
b∇⍵ ⍝ otherwise (t>1) returse between b and ⍵
}u ⍝ begin the search between u as found earlier and its half.
}
আমি নিশ্চিত নই যে 1≥⍵⍟⍣n
উপরের কোনও ডোমেন ত্রুটির সাথে ব্যর্থ হতে পারে (কারণ একটি নেতিবাচক যুক্তির লগ তাত্ক্ষণিকভাবে ব্যর্থ হতে পারে, বা একটি জটিল ফলাফল দিতে পারে, যা এর ডোমেনে ≥
থাকবে না) তবে আমি খুঁজে পেতে সক্ষম হইনি ব্যর্থ একটি মামলা।
উদাহরণ
4 sroot 65536
1.9999999999999964
4 sroot 65537
2.000000185530773
3 sroot 7625597484987
3
3 sroot 7625597400000
2.999999999843567
3 sroot 7625597500000
3.000000000027626
'3' একটি সঠিক মান হিসাবে প্রকাশিত হয় কারণ এটি বাইনারি অনুসন্ধানের দ্বারা সরাসরি হিট হওয়া মানগুলির মধ্যে একটি হতে পারে (2 থেকে দ্বিগুণ, 4-এ দ্বিখণ্ডিত)) সাধারণ ক্ষেত্রে এটি ঘটে না, সুতরাং ফলাফলটি একটি ⎕সিটি ত্রুটির সাথে মূল মান আনুমানিক করবে (আরও স্পষ্টভাবে, প্রতিটি পরীক্ষার্থীর বেসের লোগারিথমিক পরীক্ষাটি toleসিটি সহনশীলতার সাথে সম্পন্ন করা হয়))