রেজেক্স (ইসিএমএসক্রিপ্টের স্বাদ), 392 358 328 224 206 165 বাইট
ECMAScript রেজেক্সের সাথে (আনারিতে) ফিবোনাচি সংখ্যার সাথে ম্যাচ করার জন্য যে কৌশলগুলি খেলতে আসা দরকার তা হ'ল এটি অন্যান্য রেইগেক্স স্বাদে কীভাবে সেরা হয়েছিল তা থেকে অনেক দূরে হাহাকার। ফরোয়ার্ড / নেস্টেড ব্যাকরিফারেন্স বা পুনরাবৃত্তিগুলির অভাবের অর্থ হ'ল সরাসরি কিছু গণনা করা বা চালিয়ে যাওয়া মোটামুটি অসম্ভব। চেহারা পিছনের অভাব এমনকি প্রায়শই এটির পক্ষে কাজ করার পক্ষে পর্যাপ্ত জায়গা থাকাও একটি চ্যালেঞ্জ হয়ে দাঁড়ায়।
অনেকগুলি সমস্যার সম্পূর্ণ ভিন্ন দৃষ্টিকোণ থেকে যোগাযোগ করা উচিত এবং কিছু মূল অন্তর্দৃষ্টি না পৌঁছানো অবধি অবিশ্বাস্য বলে মনে হয়। আপনি যে সংখ্যাগুলির সাথে কাজ করছেন তার গাণিতিক বৈশিষ্ট্যগুলি কোনও নির্দিষ্ট সমস্যার সমাধানযোগ্য করতে সক্ষম হতে পারে তা সন্ধান করতে এটি আপনাকে আরও বিস্তৃত জাল ফেলতে বাধ্য করে।
2014 সালের মার্চ মাসে, ফিবোনাচি সংখ্যার ক্ষেত্রে এটিই ঘটেছিল। উইকিপিডিয়া পৃষ্ঠার দিকে তাকানোতে, আমি প্রথমে কোনও উপায় বের করতে পারি না, যদিও একটি নির্দিষ্ট সম্পত্তি তাত্পর্যপূর্ণভাবে কাছাকাছি মনে হয়েছিল। তারপরে গণিতবিদ টিউকন এমন একটি পদ্ধতির রূপরেখা প্রকাশ করেছিলেন যা এটি আরও পরিষ্কার করে দেয় যে এটি করা সম্ভব হবে, অন্য সম্পত্তি সহ সেই সম্পত্তি ব্যবহার করে। তিনি আসলে রিজেক্স নির্মাণে অনীহা প্রকাশ করেছিলেন। তার প্রতিক্রিয়া যখন আমি এগিয়ে গিয়েছিলাম এবং এটি করেছি:
তুমি পাগল! ... আমি ভেবেছিলাম আপনি এটি করতে পারেন।
আমার অন্যান্য ইসমাস্ক্রিপ্ট অ্যানারি গণিতের রেজেক্সেক্স পোস্টগুলির মতো, আমি একটি সতর্কতা দেব : ECMAScript রেজেজেমে অ্যানারি গাণিতিক সমস্যাগুলি কীভাবে সমাধান করবেন তা শিখার আমি সুপারিশ করছি। এটি আমার কাছে একটি আকর্ষণীয় ভ্রমণ ছিল এবং আমি যে কারও জন্য সম্ভবত এটি চেষ্টা করতে চাইতে পারি তার পক্ষে এটি লুণ্ঠন করতে চাই না, বিশেষত যারা সংখ্যা তত্ত্বের প্রতি আগ্রহী তাদের জন্য। একের পর এক সমাধানের জন্য ক্রমাগত স্পয়লার-ট্যাগযুক্ত প্রস্তাবিত সমস্যার তালিকার জন্য সেই পোস্টটি দেখুন ।
সুতরাং আপনি আর কিছু পড়বেন না যদি আপনি কিছু ইউনারী রেজেক্স যাদু আপনার জন্য নষ্ট করে না চান । আপনি যদি এই যাদুটি নিজেই বের করে আনতে চান তবে উপরের লিঙ্কযুক্ত পোস্টটিতে বর্ণিত ECMAScript রেজেক্সে কিছু সমস্যা সমাধানের মাধ্যমে আমি সুপারিশ করব।
আমি প্রথমে যে চ্যালেঞ্জটি মুখোমুখি হয়েছিলাম: ইতিবাচক পূর্ণসংখ্যার x হ'ল একটি ফিবোনাচি নম্বর এবং যদি কেবল 5x 2 হয় + 4 এবং / অথবা 5x 2 - 4 একটি নিখুঁত বর্গ হয়। তবে একটি রেজেজেমে এটি গণনা করার কোনও জায়গা নেই। আমাদের কেবলমাত্র কাজ করতে হবে সেই সংখ্যাটি। আমাদের কাছে 5 টি গুণ করে বা বর্গক্ষেত্র নেওয়ার জন্য পর্যাপ্ত জায়গাও নেই, উভয়কেই ছেড়ে দিন।
এটি কীভাবে সমাধান করা যায় সে সম্পর্কে টিউকনের ধারণা ( মূলত এখানে পোস্ট করা ):
রেজেক্স ফর্মের একটি স্ট্রিং সহ উপস্থাপিত হয় ^x*$
, z এর দৈর্ঘ্য হোক। জেডটি হাতে হাতে প্রথম কয়েকটি ফিবোনাচি সংখ্যার মধ্যে একটি কিনা তা পরীক্ষা করুন (21 পর্যন্ত করা উচিত)। যদি তা না হয়:
- কয়েকটি সংখ্যা পড়ুন, একটি <বি, যেমন খ 2 এ এর চেয়ে বড় নয়।
- 2 , আব, এবং খ তৈরি করতে এগিয়ে চেহারা দেখুন Use 2 ।
- 5A 2 + 4 বা 5a 2 - 4 হয় নিখুঁত বর্গক্ষেত্র হিসাবে জোড় করে (সুতরাং একটি অবশ্যই F n-1 হওয়া আবশ্যক কোনও n এর জন্য ) sert
- 5b 2 + 4 বা 5b 2 + 4 হয় একটি নিখুঁত বর্গক্ষেত্র হিসাবে জোড় করে (সুতরাং খ অবশ্যই F n হওয়া উচিত )।
- পূর্ববর্তী নির্মিত একটি 2 , আব এবং বি 2 ব্যবহার করে z = F 2n + 3 বা z = F 2n + 4 পরীক্ষা করুন এবং পরিচয় :
- এফ 2 এন-1 = এফ এন 2 + এফ এন -1 2
- এফ 2 এন = ( 2 এফ এন -1 + এফ এন ) এফ এন
সংক্ষেপে: এই পরিচয়পত্রগুলি আমাদের প্রদত্ত নম্বরটি ফিবোনাচি যাচাই করতে সমস্যাটি কমিয়ে আনতে দেয় যা অনেক কম সংখ্যার সংখ্যক জোড়া ফিবোনাচি কিনা তা পরীক্ষা করে । সামান্য বীজগণিত দেখায় যে বড় পরিমাণে এন (এন = 3 করা উচিত), এফ 2 এন + 3 > এফ এন + 5 এফ এন 2 + 4 যাতে সর্বদা পর্যাপ্ত স্থান থাকা উচিত।
এবং এখানে সি তে থাকা অ্যালগরিদমের একটি মকআপ যা আমি রেগেজেমে প্রয়োগ করার আগে একটি পরীক্ষা হিসাবে লিখেছিলাম।
সুতরাং আর কোনও অ্যাডো না দিয়ে, এখানে রেইজেক্সটি রয়েছে:
^((?=(x*).*(?=x{4}(x{5}(\2{5}))(?=\3*$)\4+$)(|x{4})(?=xx(x*)(\6x?))\5(x(x*))(?=(\8*)\9+$)(?=\8*$\10)\8*(?=(x\2\9+$))(x*)\12)\7\11(\6\11|\12)|x{0,3}|x{5}|x{8}|x{21})$
এটি অনলাইন চেষ্টা করুন!
এবং সুন্দর-মুদ্রিত, মন্তব্য করা সংস্করণ:
^(
(?=
(x*) # \2+1 = potential number for which 5*(\2+1)^2 ± 4
# is a perfect square; this is true iff \2+1 is a Fibonacci
# number. Outside the surrounding lookahead block, \2+1 is
# guaranteed to be the largest number for which this is true
# such that \2 + 5*(\2+1)^2 + 4 fits into the main number.
.*
(?= # tail = (\2+1) * (\2+1) * 5 + 4
x{4}
( # \3 = (\2+1) * 5
x{5}
(\2{5}) # \4 = \2 * 5
)
(?=\3*$)
\4+$
)
(|x{4}) # \5 = parity - determined by whether the index of Fibonacci
# number \2+1 is odd or even
(?=xx (x*)(\6 x?)) # \6 = arithmetic mean of (\2+1) * (\2+1) * 5 and \8 * \8,
# divided by 2
# \7 = the other half, including remainder
\5
# require that the current tail is a perfect square
(x(x*)) # \8 = potential square root, which will be the square root
# outside the surrounding lookahead; \9 = \8-1
(?=(\8*)\9+$) # \10 = must be zero for \8 to be a valid square root
(?=\8*$\10)
\8*
(?=(x\2\9+$)) # \11 = result of multiplying \8 * (\2+1), where \8 is larger
(x*)\12 # \12 = \11 / 2; the remainder will always be the same as it
# is in \7, because \8 is odd iff \2+1 is odd
)
\7\11
(
\6\11
|
\12
)
|
x{0,3}|x{5}|x{8}|x{21} # The Fibonacci numbers 0, 1, 2, 3, 5, 8, 21 cannot be handled
# by our main algorithm, so match them here; note, as it so
# happens the main algorithm does match 13, so that doesn't
# need to be handled here.
)$
সেই মন্তব্যে গুণনের অ্যালগরিদম ব্যাখ্যা করা হয়নি, তবে আমার প্রচুর সংখ্যক রেজেক্স পোস্টের অনুচ্ছেদে সংক্ষেপে ব্যাখ্যা করা হয়েছে ।
আমি ফিবোনাচি রিজেক্সের ছয়টি ভিন্ন সংস্করণ বজায় রেখেছিলাম: চারটি যা সবচেয়ে কম দৈর্ঘ্য থেকে দ্রুত গতিতে বর্ণিত হয়েছে এবং উপরে বর্ণিত অ্যালগরিদম ব্যবহার করেছে এবং অন্য দু'জন যা আলাদা, অনেক দ্রুত তবে অনেক বেশি দীর্ঘতর অ্যালগরিদম ব্যবহার করে, যা আমি পেয়েছি বাস্তবে ফিরে আসতে পারে ম্যাচ হিসাবে ফিবোনাচি সূচক (এখানে ব্যাখ্যা করা হয়েছে যে এখানে অ্যালগরিদম এই পোস্টের আওতার বাইরে, তবে এটি মূল আলোচনার সংক্ষেপে ব্যাখ্যা করা হয়েছে )। আমি মনে করি না আমি আবার অনেকটা একই ধরণের ভার্সন রেকর্ডের ভার্সন বজায় রাখতে পারব, কারণ আমি পিসিআরই এবং পার্লে আমার সমস্ত পরীক্ষা করছিলাম, তবে আমার রেজেক্স ইঞ্জিন দ্রুত যথেষ্ট যে গতির উদ্বেগগুলি আর অতটা গুরুত্বপূর্ণ নয় (এবং যদি কোনও নির্দিষ্ট নির্মাণের কারণে বাধা সৃষ্টি হয় তবে আমি এর জন্য অপ্টিমাইজেশন যুক্ত করতে পারি) - যদিও আমি সম্ভবত আবার একটি দ্রুততম সংস্করণ এবং একটি সংক্ষিপ্ততম সংস্করণ বজায় রাখতে পারি, পার্থক্য থাকলে গতি যথেষ্ট ছিল।
"ফিবাওনাচি সূচক বিয়োগ 1 টি ম্যাচ হিসাবে ফিরিয়ে দিন" সংস্করণ (ভারীভাবে গল্ফ করা হয়নি):
এটি অনলাইন চেষ্টা করুন!
গল্ফ অপ্টিমাইজেশনের সম্পূর্ণ প্রতিশ্রুতিবদ্ধ ইতিহাস সহ সমস্ত সংস্করণ গিথুবে রয়েছে:
ফিবোনাচি সংখ্যার সাথে মিলে যাওয়ার জন্য রেজেক্স - সংক্ষিপ্ত, গতি 0.txt (এই পোস্টে যেমন সংক্ষিপ্ত তবে সবচেয়ে ধীরতম)
ফিবোনাচি সংখ্যার সাথে মিলের জন্য সংক্ষিপ্ত, গতি 1.txt
রেজেক্স - সংক্ষিপ্ত, গতি 2.txt
রেজেক্স ফিবোনাচি সংখ্যার সাথে মিলে যায় - সংক্ষিপ্ত, গতি 3.
ফিবোনাচি সংখ্যার সাথে মিলের জন্য টেক্সট রেজেেক্স - ফিবোনাচি সংখ্যার সাথে মিলে যাওয়ার
জন্য দ্রুততম। টেক্সট রেজিএক্স - রিটার্ন ইনডেক্স। টেক্সট