इस चुनौती के उद्देश्य के लिए, हम कहते हैं कि एक रेगेक्स पैटर्न एक स्ट्रिंग से मेल खाता है यदि पूरी स्ट्रिंग पैटर्न से मेल खाती है, न कि केवल एक विकल्प।
यह देखते हुए दो regex पैटर्न एक और बी , हम कहते हैं कि एक है और अधिक विशेष से बी अगर हर स्ट्रिंग है के अनुरूप है एक भी अनुरूप है बी के आसपास नहीं बल्कि अन्य तरीके से। हम कहते हैं कि A , B के समतुल्य है यदि दोनों पैटर्न स्ट्रिंग्स के एक ही सेट से मेल खाते हैं। न पैटर्न अधिक अन्य की तुलना में विशेष है और न ही वे बराबर हैं जाता है, तो हम कहते हैं कि एक और बी हैं अतुलनीय ।
उदाहरण के लिए, पैटर्न Hello, .*!
की तुलना में अधिक विशिष्ट है .*, .*!
; पैटर्न (Hello|Goodbye), World!
और Hello, World!|Goodbye, World!
समतुल्य हैं; और पैटर्न Hello, .*!
और .*, World!
अतुलनीय है।
संबंध "से अधिक विशिष्ट" रेगेक्स पैटर्न के सेट पर एक सख्त आंशिक आदेश को परिभाषित करता है। विशेष रूप से, सभी पैटर्न A और B के लिए , निम्नलिखित में से एक सही है:
- A , B ( A < B ) से अधिक विशिष्ट है ।
- B A ( A > B ) से अधिक विशिष्ट है ।
- A और B समतुल्य हैं ( A = B )।
- एक और बी अतुलनीय (हैं एक ∥ बी )।
जब A और B अतुलनीय हैं, तो हम दो मामलों के बीच अंतर कर सकते हैं:
- एक और बी हैं संबंध तोड़ना ( एक ∥ बी ,) जिसका अर्थ है कि कोई स्ट्रिंग उन दोनों के अनुरूप है।
- एक और बी कर रहे हैं अन्तर्विभाजक ( एक ≬ बी ,) जिसका अर्थ है कि कुछ तार दोनों से मेल खाते हैं।
चुनौती
एक प्रोग्राम या एक फ़ंक्शन लिखें जो रेगेक्स पैटर्न की एक जोड़ी लेता है और उपरोक्त आदेश का उपयोग करके उनकी तुलना करता है। है कि, अगर दो पैटर्न हैं एक और बी , कार्यक्रम का निर्धारण करना चाहिए कि क्या एक < बी , ए > बी ,
एक = बी या एक ∥ बी ।
× 92% बोनस एक अतिरिक्त बोनस दिया जाता है यदि, जब पैटर्न अतुलनीय होते हैं, तो कार्यक्रम निर्धारित करता है कि क्या वे अंतरविरोध या असहमति जता रहे हैं।
इनपुट और आउटपुट
कार्यक्रम को दो रेगेक्स पैटर्न को स्वीकार करना चाहिए, जैसे कि नीचे दिए गए स्वाद में। आप फ़ंक्शन तर्कों या समकक्ष पद्धति के रूप में STDIN , कमांड लाइन के माध्यम से इनपुट पढ़ सकते हैं । आप मान सकते हैं कि पैटर्न मान्य हैं।
तुलना के परिणाम के आधार पर कार्यक्रम को चार अलग-अलग आउटपुट (या पांच अलग-अलग आउटपुट में से एक, यदि आप उपरोक्त बोनस के लिए जा रहे हैं) का उत्पादन करना चाहिए (सटीक आउटपुट आपके ऊपर हैं।) आप आउटपुट को STDOUT में लिख सकते हैं। , इसे फ़ंक्शन के परिणाम के रूप में लौटाएं या समकक्ष पद्धति का उपयोग करें ।
रेगेक्स फ्लेवर
आप जो भी रेगेक्स सुविधाएँ पसंद करते हैं, उसका समर्थन कर सकते हैं, लेकिन आपको निम्नलिखित का समर्थन करना चाहिए :
- साथ वैकल्पिक
|
। - के साथ परिमाण
*
। - के साथ समूहीकरण
(
और)
। - किसी भी पात्र से मेल खाना (संभवतः नए सिरे को छोड़कर)
.
। - (वैकल्पिक: × 80% बोनस) क्रमशः और , के साथ सरल और नकारात्मक चरित्र वर्गों का मिलान । आपको किसी भी पूर्वनिर्धारित चरित्र वर्ग (जैसे ) का समर्थन करने की आवश्यकता नहीं है, लेकिन आपको चरित्र श्रेणियों का समर्थन करना चाहिए।
[…]
[^…]
[:digit:]
- चरित्र के साथ भागने
\
। कम से कम विशेष पात्रों (यानी|*().[^-]\
) और अधिमानतः अन्य स्वादों (जैसे{}
) में भी सामान्य विशेष वर्णों को बचाना संभव होना चाहिए, लेकिन निरर्थक पात्रों से बचते हुए व्यवहार अनिर्दिष्ट है। विशेष रूप से, आपको विशेष एस्केप अनुक्रमों का समर्थन करने की आवश्यकता नहीं है जैसे कि\n
एक नई पंक्ति और पसंद के लिए। एक संभावित कार्यान्वयन केवल\
एक शाब्दिक के रूप में चरित्र को लेने के लिए है ।
आप एक ऐसे इनपुट चरित्र की मौजूदगी को मान सकते हैं जो किसी भी शाब्दिक रूप से मेल नहीं खा सकता है (अर्थात यह केवल .
वर्ण वर्गों और नकारात्मक वर्णों से मेल खा सकता है ।)
अतिरिक्त नियम
- आप स्ट्रिंग मिलान और प्रतिस्थापन के उद्देश्य के लिए रेगेक्स लाइब्रेरी या बिलिन रेगेक्स कार्यक्षमता का उपयोग कर सकते हैं।
- आप किसी भी स्थानीय से संबंधित मुद्दों, जैसे टकराव के नियमों की अनदेखी कर सकते हैं।
- स्पष्ट बताने के लिए: आपका कार्यक्रम समाप्त होना चाहिए। यह समय-समय पर विशिष्ट पैटर्न को देखते हुए उचित मात्रा में निष्पादित करना चाहिए (निश्चित रूप से एक घंटे से अधिक नहीं, अधिमानतः बहुत कम)।
स्कोरिंग
यह कोड-गोल्फ है। आपका स्कोर है उत्पाद का कोड आकार , बाइट में, और के किसी भी बोनस । सबसे कम स्कोर जीतता है।
परीक्षण के मामलों
परीक्षण मामलों का प्रारूप इस प्रकार है:
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
<Test ID>
<Pattern A>
<Ordering>
<Pattern B>
...
<Test ID>
परीक्षण के मामले के लिए एक पहचानकर्ता कहां है, <Pattern A>
और <Pattern B>
रेगेक्स पैटर्न हैं और <Ordering>
उनके बीच क्रमबद्धता है, और इनमें से एक है:
<
:<Pattern A>
से अधिक विशिष्ट है<Pattern B>
।>
:<Pattern B>
से अधिक विशिष्ट है<Pattern A>
।=
: पैटर्न बराबर हैं।|
: पैटर्न अतुलनीय और निराशाजनक हैं।X
: पैटर्न अतुलनीय और प्रतिच्छेदन हैं।
विशेष <empty pattern>
पैटर्न खाली पैटर्न के लिए खड़ा है।
ए बुनियादी पैटर्न
B. जटिल पैटर्न
सी। चरित्र वर्गों के साथ बुनियादी पैटर्न
डी। चरित्र वर्गों के साथ जटिल पैटर्न
परीक्षण कार्यक्रम
Regex पैटर्न की तुलना करने के लिए निम्नलिखित स्निपेट का उपयोग किया जा सकता है:
<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>