ECMAScript Regex , 733+ 690+ 158 119 118 (117🐌) বাইট
রেজিএক্সে আমার আগ্রহটি 4½ বছরেরও বেশি নিষ্ক্রিয়তার পরে পুনর্নবীকরণের সাথে উত্সাহিত হয়েছিল। এর মতো, আমি আরও প্রাকৃতিক নম্বর সেট এবং ফাংশনগুলির সন্ধানে অনার্য ইসকামাস্ক্রিপ্ট রিজেক্সেসের সাথে মেলেছিলাম, আমার রেজেক্স ইঞ্জিনটি পুনরায় উন্নত করতে শুরু করেছি এবং পিসিআরআইতেও ব্রাশ করতে শুরু করেছি।
আমি ECMAScript রেজেক্সে গাণিতিক ক্রিয়াকলাপগুলি নির্মাণের পরকতায় মুগ্ধ। সমস্যাগুলি অবশ্যই সম্পূর্ণ ভিন্ন দৃষ্টিকোণ থেকে যোগাযোগ করা উচিত এবং কোনও মূল অন্তর্দৃষ্টি না আসা পর্যন্ত তারা আদৌ দ্রবণযোগ্য কিনা তা অজানা। এটি কোন গাণিতিক বৈশিষ্ট্যগুলি কোনও নির্দিষ্ট সমস্যার সমাধানযোগ্য করতে ব্যবহার করতে সক্ষম হতে পারে তা খুঁজে বের করার জন্য এটি আরও বিস্তৃত নেট .ালার জন্য জোর করে।
ফ্যাক্টরিয়াল সংখ্যাগুলি মিলানো এমন একটি সমস্যা ছিল যা আমি ২০১৪ সালে মোকাবেলা করার বিষয়টি বিবেচনাও করি নি - বা আমি যদি কেবল মুহুর্তে এটি করে থাকি তবে এটি সম্ভাব্য হওয়ার সম্ভাবনা খুব কম বলে খারিজ করে দেয়। তবে গত মাসে, আমি বুঝতে পারি যে এটি করা যেতে পারে।
আমার অন্যান্য ইসিএমএ রেজেজেক্স পোস্টগুলির মতো আমিও একটি সতর্কতা দেব : ইসমাস্ক্রিপ্ট রিজেক্সে অযৌক্তিক গাণিতিক সমস্যাগুলি কীভাবে সমাধান করা যায় তা শেখার জন্য আমি উচ্চতর পরামর্শ দিচ্ছি। এটি আমার কাছে একটি আকর্ষণীয় ভ্রমণ ছিল এবং আমি যে কারও জন্য সম্ভবত এটি চেষ্টা করতে চাইতে পারি তার পক্ষে এটি লুণ্ঠন করতে চাই না, বিশেষত যারা সংখ্যা তত্ত্বের প্রতি আগ্রহী তাদের জন্য। একের পর এক সমাধান করার জন্য পরের বার স্পয়লার-ট্যাগযুক্ত প্রস্তাবিত সমস্যার তালিকার জন্য এই পূর্ববর্তী পোস্টটি দেখুন ।
সুতরাং আপনি যদি কিছু উন্নত ইউনারি রেজেক্স যাদু আপনার জন্য নষ্ট না করতে চান তবে আর পড়বেন না । আপনি যদি এই যাদুটি নিজেই বের করে আনতে চান তবে উপরের লিঙ্কযুক্ত পোস্টটিতে বর্ণিত ECMAScript রেজেক্সে কিছু সমস্যা সমাধানের মাধ্যমে আমি সুপারিশ করব।
এটি আমার ধারণা ছিল:
এই সংখ্যাটি সেটটি মিলে যাওয়ার সমস্যা, অন্য বেশিরভাগের মতো, ইসিএমএতে সাধারণত দুটি লুপে দুটি পরিবর্তিত সংখ্যার খোঁজ রাখা সম্ভব হয় না। কখনও কখনও এগুলি একাধিকবার করা যায় (যেমন একই বেসের শক্তিগুলি একসাথে নির্বিঘ্নে যুক্ত করা যেতে পারে) তবে এটি তাদের বৈশিষ্ট্যগুলির উপর নির্ভর করে on সুতরাং আমি কেবল ইনপুট নম্বর দিয়ে শুরু করতে পারি না, এবং এটি 1 পর্যন্ত পৌঁছানো পর্যন্ত ক্রমবর্ধমান বর্ধিত লভ্যাংশ দ্বারা ভাগ করতে পারি (বা তাই আমি ভেবেছিলাম, কমপক্ষে)।
তারপরে আমি ফ্যাক্টরিয়াল সংখ্যায় মূল কারণগুলির সংখ্যাবৃদ্ধি নিয়ে কিছু গবেষণা করেছি এবং শিখেছি যে এর জন্য একটি সূত্র আছে - এবং এটি সম্ভবত আমি ইসিএমএ রেজেক্সে প্রয়োগ করতে পারি!
এটির জন্য কিছুক্ষণ স্টিভ করার পরে, এবং এর মধ্যে আরও কিছু রেজিেক্সগুলি নির্মাণ করার পরে, আমি ফ্যাক্টরিয়াল রেজেক্স লেখার কাজটি হাতে নিয়েছি। এটি বেশ কয়েক ঘন্টা সময় নিয়েছে, তবে দুর্দান্তভাবে কাজ শুরু করেছে। একটি যুক্ত বোনাস হিসাবে, অ্যালগরিদমটি ম্যাচ হিসাবে বিপরীত ফ্যাক্টরিয়াল ফিরিয়ে দিতে পারে। এটি কোনও এড়ানো ছিল না, এমনকি; ইসিএমএতে এটি কীভাবে বাস্তবায়ন করা উচিত তার প্রকৃতির দ্বারা, অন্য কিছু করার আগে বিপরীতমুখীটি কী তা সম্পর্কে একটি ধারণা নেওয়া প্রয়োজন।
নেতিবাচক দিকটি ছিল যে এই অ্যালগরিদমটি খুব দীর্ঘ রেইগেক্সের জন্য তৈরি হয়েছিল ... তবে আমি খুশি হয়েছি যে এটি আমার 651 বাইটের গুণিতক রেজেক্স (যেটি অপ্রচলিত হয়ে শেষ হয়েছিল, কারণ 50 এর জন্য তৈরি একটি আলাদা পদ্ধতিতে ব্যবহৃত একটি প্রযুক্তি প্রয়োজন হয়েছিল) বাইট রেজেক্স)। আমি আশা করছিলাম যে কোনও সমস্যাটি এই কৌশলটির প্রয়োজন হবে: দু'টি সংখ্যার উপর অপারেটিং করা, যা একই বেসের উভয় শক্তি, একটি লুপে, একে অপ্রত্যাশিতভাবে একসাথে যুক্ত করে এবং প্রতিটি পুনরাবৃত্তিতে এগুলি পৃথক করে।
তবে এই অ্যালগরিদমের অসুবিধা এবং দৈর্ঘ্যের কারণে, আমি এটি প্রয়োগ করতে আণবিক lookaheads (ফর্মের (?*...)
) ব্যবহার করেছি। এটি ECMAScript বা অন্য কোনও মূলধারার রেজেক্স ইঞ্জিনে নয় এমন একটি বৈশিষ্ট্য, যা আমি আমার ইঞ্জিনে প্রয়োগ করেছি । আণবিক লুকোহেডের অভ্যন্তরে কোনও ক্যাপচার না থাকলে এটি কার্যত একটি পারমাণবিক লুকের সাথে সমান, তবে ক্যাপচারগুলির সাহায্যে এটি খুব শক্তিশালী হতে পারে। ইঞ্জিনটি লুকোহেডে ব্যাকট্র্যাক করবে এবং এটি কোনও মানটি অনুমান করতে ব্যবহার করা যেতে পারে যা ইনপুটটির অক্ষর না খেয়ে সমস্ত সম্ভাবনার (পরবর্তী পরীক্ষার জন্য) চক্রটি আবর্তিত করে। এগুলি ব্যবহার করে অনেক পরিষ্কার বাস্তবায়নের ব্যবস্থা করা যায়। (পরিবর্তনশীল দৈর্ঘ্যের বর্ণনক্ষেত্রটি আণবিক চেহারাগুলির তুলনায় পাওয়ারের তুলনায় খুব কমই সমান, তবে পরবর্তীটি আরও সোজা এবং মার্জিত বাস্তবায়নের দিকে ঝোঁক দেয়))
সুতরাং 733 এবং 690 বাইট দৈর্ঘ্য আসলে সমাধানের ECMAScript- সামঞ্জস্যপূর্ণ অবতারকে উপস্থাপন করে না - সুতরাং তাদের পরে "+"; সেই অ্যালগরিদমকে খাঁটি ইসমাস্ক্রিপ্টে পোর্ট করা সম্ভব (যা এর দৈর্ঘ্যটি খানিকটা বাড়িয়ে তুলবে) তবে আমি এটার কাছাকাছি যাই নি ... কারণ আমি অনেক সহজ এবং আরও কমপ্যাক্ট অ্যালগরিদমের কথা ভেবেছিলাম! এমন একটি যা আণবিক লুক হেডস ছাড়া সহজেই প্রয়োগ করা যেতে পারে। এটি উল্লেখযোগ্যভাবে দ্রুতও।
আগের মতো এই নতুনটিকে অবশ্যই বিপরীতমুখী কৌতূহলের উপর অনুমান করা উচিত, সমস্ত সম্ভাবনার মধ্য দিয়ে সাইকেল চালানো এবং ম্যাচের জন্য তাদের পরীক্ষা করা testing এটি যে কাজটি করতে হবে তার জন্য জায়গা তৈরি করতে N কে 2 দ্বারা বিভক্ত করে এবং তারপরে একটি লুপ বীজ করে যা বারবার 3 দ্বারা শুরু হওয়া বিভাজক এবং প্রতিবার ইনক্রিমেন্টের দ্বারা ইনপুটটি বিভক্ত করবে। (যেমন, 1! এবং 2! মূল অ্যালগরিদমের সাথে মিলে যায় না, এবং পৃথকভাবে মোকাবেলা করতে হবে)) বিভাজকটি চলমান অংশে যুক্ত করে ট্র্যাক রাখা হয়; এই দুটি সংখ্যা নির্বিঘ্নে পৃথক করা যেতে পারে কারণ, এম ধরে নিচ্ছি! == N, চলমান ভাগফল এম দ্বারা বিভাজক হতে থাকবে যতক্ষণ না এটি এম এর সমান হয় until
এই রেজেক্স লুপের অন্তর্নিহিত অংশে বিভাজন-দ্বারা-পরিবর্তনশীল করে। বিভাগের অ্যালগরিদমটি আমার অন্যান্য রেজিক্সের মতো (এবং বহুগুণ অ্যালগরিদমের অনুরূপ): A≤B এর জন্য, A * B = C যদি কেবলমাত্র C% A = 0 এবং B হয় সর্বাধিক সংখ্যা যা B≤C কে সন্তুষ্ট করে এবং সি% বি = 0 এবং (সিবি- (এ-1))% (বি -1) = 0, যেখানে সি লভ্যাংশ, এ বিভাজক, এবং বি ভাগফল হয়। (A≥B এর ক্ষেত্রে একই ধরণের অ্যালগরিদম ব্যবহার করা যেতে পারে, এবং যদি এটিকে বি এর সাথে কীভাবে তুলনা করা হয় তা যদি না জানা থাকে তবে একটি অতিরিক্ত বিভাজন পরীক্ষা যা প্রয়োজন তা সবই প্রয়োজন))
তাই আমি ভালবাসি যে সমস্যাটি আমার গল্ফ-অনুকূলিত ফিবোনাচি রেজেনেক্সের চেয়ে কম জটিলতায়ও কমিয়ে আনতে সক্ষম হয়েছিল , তবে আমি হতাশা সহকারে বলছি যে আমার মাল্টিপ্লেক্সিং-পাওয়ার-অফ-একই-বেস কৌশলটি অন্য সমস্যার জন্য অপেক্ষা করতে হবে এটি আসলে এটি প্রয়োজন, কারণ এটি এক না। এটি আমার 651 বাইটের গুণিত অ্যালগরিদমের গল্প 50 বাইট এক দ্বারা পুনরায় সংশ্লেষ করা হচ্ছে!
সম্পাদনা: গ্রিমির দ্বারা পাওয়া ট্রিকটি ব্যবহার করে আমি 1 বাইট (119 → 118) ছাড়তে সক্ষম হয়েছি যা ভাগফলটি বিভাজকের থেকে বড় বা সমান হওয়ার গ্যারান্টিযুক্ত ক্ষেত্রে এই সংক্ষিপ্ত বিভাগকে আরও সংক্ষিপ্ত করতে পারে।
আর কোনও অ্যাডো না দিয়ে, এখানে রেইজেক্সটি রয়েছে:
সত্য / মিথ্যা সংস্করণ (118 বাইট):
^((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\3$|^xx?$
এটি অনলাইন চেষ্টা করুন!
বিপরীত ফ্যাক্টরিয়াল বা কোনও মিল নেই (124 বাইট):
^(?=((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\3$)\3|^xx?$
এটি অনলাইন চেষ্টা করুন!
ECMAScript +\K
(120 বাইট) এ বিপরীত ফ্যাক্টরিয়াল বা কোনও মিল নেই Return
^((x*)x*)(?=\1$)(?=(xxx\2)+$)((?=\2\3*(x(?!\3)xx(x*)))\6(?=\5+$)(?=((x*)(?=\5(\8*$))x)\7*$)x\9(?=x\6\3+$))*\2\K\3$|^xx?$
এবং মন্তব্য সহ মুক্ত-দুরত্ব সংস্করণ:
^
(?= # Remove this lookahead and the \3 following it, while
# preserving its contents unchanged, to get a 119 byte
# regex that only returns match / no-match.
((x*)x*)(?=\1$) # Assert that tail is even; \1 = tail / 2;
# \2 = (conjectured N for which tail == N!)-3; tail = \1
(?=(xxx\2)+$) # \3 = \2+3 == N; Assert that tail is divisible by \3
# The loop is seeded: X = \1; I = 3; tail = X + I-3
(
(?=\2\3*(x(?!\3)xx(x*))) # \5 = I; \6 = I-3; Assert that \5 <= \3
\6 # tail = X
(?=\5+$) # Assert that tail is divisible by \5
(?=
( # \7 = tail / \5
(x*) # \8 = \7-1
(?=\5(\8*$)) # \9 = tool for making tail = \5\8
x
)
\7*$
)
x\9 # Prepare the next iteration of the loop: X = \7; I += 1;
# tail = X + I-3
(?=x\6\3+$) # Assert that \7 is divisible by \3
)*
\2\3$
)
\3 # Return N, the inverse factorial, as a match
|
^xx?$ # Match 1 and 2, which the main algorithm can't handle
এই রেজিেক্সগুলির আমার গল্ফ অপ্টিমাইজেশনের পুরো ইতিহাস গিথুবটিতে রয়েছে:
গৌণিক সংখ্যা মেলানোর জন্য Regex - সংখ্যাধিক্য-তুলনা পদ্ধতি, আণবিক lookahead.txt সঙ্গে
গৌণিক numbers.txt মেলানোর জন্য Regex (এক উপরে দেখানো হয়েছে)
((x*)x*)
((x*)+)
((x+)+)
n = 3 !\2
3 - 3 = 0
.NET রেজেক্স ইঞ্জিনটি তার আচরণটি ECMAScript মোডে অনুকরণ করে না এবং এইভাবে 117 বাইট রেজেক্স কাজ করে:
এটি অনলাইন চেষ্টা করুন! (এক্সটেনশিয়াল-স্লোডাউন সংস্করণ,। নেট রিজেক্স ইঞ্জিন + ইসমাস্ক্রিপ্ট এমুলেশন সহ)
1
?