এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা বলি যে পুরো স্ট্রিংটি কেবল একটি স্ট্রিং নয়, প্যাটার্নটির সাথে মিলে গেলে একটি রেজেক্স প্যাটার্ন একটি স্ট্রিংয়ের সাথে মেলে।
প্রদত্ত দুটি Regex নিদর্শন একজন এবং বি , আমরা বলতে যে একটি হয় আরো বিশেষ চেয়ে বি যদি প্রত্যেক স্ট্রিংটি দ্বারা মেলানো হয় একটি এছাড়াও দ্বারা মেলানো হয় বি প্রায় কিন্তু অন্য উপায়। আমরা যে একটি হল সমতুল্য করার বি উভয় নিদর্শন ঠিক মেলে স্ট্রিং একই সেট। তন্ন তন্ন প্যাটার্ন আরো অন্য চেয়ে বিশেষ নেই এবং তারা হয় সমতুল্য হয়, তাহলে আমরা বলতে যে একটি এবং বি হয় অতুলনীয় ।
উদাহরণস্বরূপ, প্যাটার্নটি এর Hello, .*!
চেয়ে বেশি বিশেষায়িত .*, .*!
; নিদর্শন (Hello|Goodbye), World!
এবং Hello, World!|Goodbye, World!
সমতুল্য; এবং নিদর্শন Hello, .*!
এবং .*, World!
অতুলনীয়।
রিজেক্স প্যাটার্নগুলির সেটগুলিতে "আরও বেশি বিশেষজ্ঞের" সম্পর্কটি একটি কঠোর আংশিক ক্রম সংজ্ঞায়িত করে। বিশেষত, A এবং B সমস্ত নিদর্শনগুলির জন্য , নিম্নলিখিতগুলির মধ্যে ঠিক একটি সত্য:
- এ বি ( এ < বি ) এর চেয়ে বেশি বিশেষায়িত ।
- বি এ ( এ > বি ) এর চেয়ে বেশি বিশেষায়িত ।
- এ এবং বি সমান ( এ = বি )।
- A এবং B অতুলনীয় ( A ∥ B )।
যখন এ এবং বি অতুলনীয়, আমরা আরও দুটি ক্ষেত্রে পার্থক্য করতে পারি:
- একজন এবং বি হয় অসংলগ্ন করা ( একটি ∥ বি ,) যার অর্থ কোন স্ট্রিং তাদের উভয়ের দ্বারা মেলানো হয়।
- একজন এবং বি করছে ছেদ ( একটি ≬ বি ,) যার অর্থ যে কিছু স্ট্রিং উভয় দ্বারা মেলানো হয়।
চ্যালেঞ্জ
এমন একটি প্রোগ্রাম বা একটি ফাংশন লিখুন যা এক জোড়া রিজেক্স নিদর্শন নেয় এবং উপরের ক্রমটি ব্যবহার করে তাদের তুলনা করে। এটি হ'ল দুটি নিদর্শন যদি A এবং B হয় তবে প্রোগ্রামটি A < B , A > B ,
A = B বা A ∥ B নির্ধারণ করবে ।
× 92% বোনাস একটি অতিরিক্ত বোনাস দেওয়া হয় যদি, নিদর্শনগুলি অতুলনীয় হয়, প্রোগ্রামটি নির্ধারণ করে যে তারা ছেদ করছে বা বিচ্ছিন্ন whether
ইনপুট এবং আউটপুট
প্রোগ্রামটির নীচে সংজ্ঞায়িত স্বাদে দুটি রেজেক্স প্যাটার্নগুলি স্ট্রিং হিসাবে গ্রহণ করা উচিত। ফাংশন আর্গুমেন্ট বা সমতুল্য পদ্ধতি হিসাবে আপনি STDIN , কমান্ড লাইনটির মাধ্যমে ইনপুটটি পড়তে পারেন । আপনি ধরে নিতে পারেন যে নিদর্শনগুলি বৈধ।
প্রোগ্রামটি তুলনামূলক ফলাফলের উপর নির্ভর করে ঠিক চারটি স্বতন্ত্র আউটপুটগুলির (বা পাঁচটি স্বতন্ত্র আউটপুটগুলির উপরের বোনাসের জন্য যাচ্ছেন) তৈরি করতে হবে (সঠিক আউটপুটগুলি আপনার উপর নির্ভর করে)) আপনি আউটপুটটি STDOUT এ লিখতে পারেন , এটি ফাংশনের ফলাফল হিসাবে ফিরিয়ে দিন বা একটি সমতুল্য পদ্ধতি ব্যবহার করুন ।
রেজেক্স ফ্লেভার
আপনার পছন্দমতো রেজেক্স বৈশিষ্ট্যগুলি আপনি সমর্থন করতে পারেন তবে আপনাকে অবশ্যই নিম্নলিখিতগুলির সমর্থন করতে পারেন :
- সঙ্গে বিকল্প
|
। - সঙ্গে পরিমাপ
*
। - সাথে গ্রুপিং করা
(
এবং)
। - সমন্বয় কোনো চরিত্র সঙ্গে (সম্ভবত ব্যতীত নতুন লাইন)
.
। - (Alচ্ছিক: × 80% বোনাস) যথাযথ এবং যথাক্রমে সাধারণ এবং তুচ্ছ চরিত্রের ক্লাসগুলির সাথে মিলছে । আপনাকে কোনও পূর্বনির্ধারিত চরিত্রের ক্লাসগুলি সমর্থন করতে হবে না (উদাঃ ) তবে আপনার চরিত্রের ব্যাপ্তিগুলি সমর্থন করা উচিত।
[…]
[^…]
[:digit:]
- ক্যারেক্টার পলায়নের সঙ্গে
\
। কমপক্ষে বিশেষ চরিত্রগুলি (যেমন|*().[^-]\
) এবং অন্যান্য স্বাদে (যেমন,{}
) সাধারণ বিশেষ অক্ষরগুলি অন্তর্ভুক্ত করা সম্ভব হওয়া উচিত, তবে বিশেষ বর্ণগুলি থেকে বেরিয়ে আসার সময় আচরণটি অনির্ধারিত। বিশেষত, আপনাকে\n
কোনও নতুন লাইন এবং এর মতো বিশেষ এ্যাসিক সিকোয়েন্সগুলি সমর্থন করতে হবে না । একটি সম্ভাব্য বাস্তবায়ন হ'ল\
আক্ষরিক হিসাবে নিম্নলিখিত অক্ষরটি গ্রহণ করা ।
আপনার কোনো ইনপুট অক্ষর যে কোনো আক্ষরিক মেলে না করা যেতে পারে existance অনুমান হতে পারে (যেমন এটি শুধুমাত্র দ্বারা মেলানো যাবে .
এবং অস্বীকার চরিত্র ক্লাস।)
অতিরিক্ত বিধি
- আপনি কেবল স্ট্রিং মেলানো এবং প্রতিস্থাপনের উদ্দেশ্যে রিজেক্স লাইব্রেরি বা বিল্টিন রিজেক্স কার্যকারিতা ব্যবহার করতে পারেন।
- আপনি কোনও স্থানীয় সম্পর্কিত সম্পর্কিত সমস্যা যেমন ক্যালেশন বিধি উপেক্ষা করতে পারেন।
- সুস্পষ্টভাবে বলতে: আপনার প্রোগ্রামটি অবশ্যই শেষ করতে হবে। এটি নির্দিষ্ট ধরণের নিদর্শন প্রদত্ত যুক্তিসঙ্গত পরিমাণে কার্যকর করা উচিত (অবশ্যই এক ঘণ্টার বেশি নয়, সম্ভবত অনেকটা কম))
স্কোরিং
এটি কোড-গল্ফ। তোমার সংগ্রহ পণ্য এর কোড আকার , বাইট, এবং কোন বোনাস । সর্বনিম্ন স্কোর ধিক্কার জানাই।
পরীক্ষার মামলা
পরীক্ষার মামলার বিন্যাসটি নিম্নরূপ:
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
...
কোথায় <Test ID>
পরীক্ষা ক্ষেত্রে জন্য একটি আইডেন্টিফায়ার হয়, <Pattern A>
এবং <Pattern B>
Regex নিদর্শন হয় এবং <Ordering>
তাদের মধ্যে ক্রম, এবং এগুলির মধ্যে একটি:
<
: এর<Pattern A>
চেয়ে বেশি বিশেষায়িত<Pattern B>
।>
: এর<Pattern B>
চেয়ে বেশি বিশেষায়িত<Pattern A>
।=
: নিদর্শন সমান।|
: নিদর্শনগুলি অতুলনীয় এবং বিচ্ছিন্ন।X
: নিদর্শনগুলি অতুলনীয় এবং ছেদযুক্ত।
বিশেষ মানটি <empty pattern>
খালি প্যাটার্নকে বোঝায়।
উ: বেসিক নিদর্শনসমূহ
বি। জটিল জটিল নিদর্শন
সি। অক্ষর ক্লাস সহ বেসিক নিদর্শন
D. অক্ষর ক্লাস সহ জটিল নিদর্শন
পরীক্ষা প্রোগ্রাম
নিম্নলিখিত স্নিপেটটি রেজেক্স নিদর্শনগুলির সাথে তুলনা করতে ব্যবহার করা যেতে পারে:
<style>#main {display: none;}#main[loaded] {display: inline;}.pattern_container {position: relative;}.pattern_underlay, .pattern {font: 12pt courier, monospace;overflow: hidden;white-space: pre;padding: 7px;box-sizing: border-box;}.pattern_underlay {background-color: #dddddd;color: #707070;border-radius: 4px;box-shadow: 0.5px 0.5px 2.5px #aaaaaa;}.pattern_underlay[error] {background-color: #ffccbb;}.pattern {position: absolute;left: 0px;top: 0px;background: none;border: none;width: 100%;height: 100%;resize: none;white-space: normal;}#ordering {min-width: 28pt;text-align: center;font-size: 16pt;}#status {padding: 5px;background-color: #fffdce;box-shadow: 1.5px 1.5px 3.5px #aaaaaa;font-size: 10pt;white-space: pre;display: none;}#status[error] {display: inline;background-color: #ffe8df;}#status[loading] {display: inline;}.inline_code {background-color: #dddddd;font: 12pt courier, monospace;padding: 2px;}.placeholder {visibility: hidden;}.error_text {background-color: #fffcb7};</style><span id="main"><table><tr><td><div class="pattern_container"><div class="pattern_underlay" id="pattern1_underlay"></div><textarea class="pattern" id="pattern1" oninput="compare()">Hello, .*!</textarea></div></td><td id="ordering"></td><td><div class="pattern_container"><div class="pattern_underlay" id="pattern2_underlay"></div><textarea class="pattern" id="pattern2" oninput="compare()">.*, .*!</textarea></div></td></tr></table><br></span><span id="status" loading>Loading...</span><script type='text/javascript'>var Module = {setStatus: function (status) {document.getElementById("status").innerHTML = status;if (status == "") {compare();document.getElementById("status").removeAttribute("loading");document.getElementById("main").setAttribute("loaded", 1);}}};function underlay_chars(str) {if (/^\n*$/.exec(str))return str.split("\n").map(function () { return '<span class="placeholder"> \n</span>'; });if (str.indexOf("\n") >= 0)str = str.replace(/\s*$/gm, function (m) { return m.replace(/[^\n]/g, "\0"); });return (str + "\n").split("").map(function (c) {if (c == "\0") return "·";else return '<span class="placeholder">' + c + '</span>';});}function underlay_str(str) {return underlay_chars(str).join("");}function str_to_array32(str) {a = [];for (c of str) {n = c.charCodeAt(0);a.push(n & 0xff, (n >> 8) & 0xff, (n >> 16) & 0xff, n >> 24);}a.push(0, 0, 0, 0);return a;}function compare() {try {for (e of ["pattern1_underlay", "pattern2_underlay", "status"])document.getElementById(e).removeAttribute("error");for (e of ["pattern1", "pattern2"])document.getElementById(e + "_underlay").innerHTML = underlay_str(document.getElementById(e).value);c = Module.ccall("regex_compare", "number", ["array", "array"], [str_to_array32(document.getElementById("pattern1").value),str_to_array32(document.getElementById("pattern2").value)]);if (c >= 0)document.getElementById("ordering").innerHTML = "∥≬<>="[c];else {i = Module.ccall("regex_error_index", "number", [], []);l = Module.ccall("regex_error_length", "number", [], []);e = document.getElementById("pattern" + -c + "_underlay");t = underlay_chars(document.getElementById("pattern" + -c).value);e.setAttribute("error", 1);e.innerHTML =t.slice(0, i).join("") +'<span class="error_text">' + t.slice(i, i + l).join("") + "</span>" +t.slice(i + l).join("");e.setAttribute("error", 1);throw "Pattern error: " + Module.ccall("regex_error", "string", [], []).replace(/`(.*?)'/g, '<span class="inline_code">$1</span>');}} catch (e) {document.getElementById("ordering").innerHTML = "??";document.getElementById("status").innerHTML = e;document.getElementById("status").setAttribute("error", 1);}}</script><script async type="text/javascript" src="https://gist.githack.com/anonymous/91f27d6746566c7b4e4c/raw/c563bf84a01c3a1c6e5f021369a3e730a2e74a1a/rpo.js"></script>