রেজেক্স প্যাটার্নগুলির আংশিক অর্ডারিং


25

এই চ্যালেঞ্জের উদ্দেশ্যে, আমরা বলি যে পুরো স্ট্রিংটি কেবল একটি স্ট্রিং নয়, প্যাটার্নটির সাথে মিলে গেলে একটি রেজেক্স প্যাটার্ন একটি স্ট্রিংয়ের সাথে মেলে।

প্রদত্ত দুটি Regex নিদর্শন  একজন  এবং  বি , আমরা বলতে যে  একটি  হয় আরো বিশেষ চেয়ে  বি   যদি প্রত্যেক স্ট্রিংটি দ্বারা মেলানো হয়  একটি  এছাড়াও দ্বারা মেলানো হয়  বি   প্রায় কিন্তু অন্য উপায়। আমরা যে  একটি  হল সমতুল্য করার  বি  উভয় নিদর্শন ঠিক মেলে স্ট্রিং একই সেট। তন্ন তন্ন প্যাটার্ন আরো অন্য চেয়ে বিশেষ নেই এবং তারা হয় সমতুল্য হয়, তাহলে আমরা বলতে যে  একটি  এবং  বি  হয় অতুলনীয়

উদাহরণস্বরূপ, প্যাটার্নটি এর Hello, .*!চেয়ে বেশি বিশেষায়িত .*, .*!; নিদর্শন (Hello|Goodbye), World!এবং Hello, World!|Goodbye, World!সমতুল্য; এবং নিদর্শন Hello, .*!এবং .*, World!অতুলনীয়।

রিজেক্স প্যাটার্নগুলির সেটগুলিতে "আরও বেশি বিশেষজ্ঞের" সম্পর্কটি একটি কঠোর আংশিক ক্রম সংজ্ঞায়িত করে। বিশেষত, A  এবং  B সমস্ত নিদর্শনগুলির জন্য  , নিম্নলিখিতগুলির মধ্যে ঠিক একটি সত্য:

  • বি  ( < বি ) এর  চেয়ে বেশি বিশেষায়িত  ।
  • বি  ( > বি ) এর  চেয়ে বেশি বিশেষায়িত  ।
  •  এবং  বি  সমান ( = বি )।
  • A  এবং  B  অতুলনীয় ( AB )।

যখন   এবং  বি  অতুলনীয়, আমরা আরও দুটি ক্ষেত্রে পার্থক্য করতে পারি:

  • একজন  এবং  বি  হয় অসংলগ্ন করা ( একটিবি ,) যার অর্থ কোন স্ট্রিং তাদের উভয়ের দ্বারা মেলানো হয়।
  • একজন  এবং  বি  করছে ছেদ ( একটিবি ,) যার অর্থ যে কিছু স্ট্রিং উভয় দ্বারা মেলানো হয়।

চ্যালেঞ্জ

এমন একটি প্রোগ্রাম বা একটি ফাংশন লিখুন যা এক জোড়া রিজেক্স নিদর্শন নেয় এবং উপরের ক্রমটি ব্যবহার করে তাদের তুলনা করে। এটি হ'ল দুটি নিদর্শন যদি  A  এবং  B হয় তবে প্রোগ্রামটি  A < B ,  A > B ,
A = B  বা  AB নির্ধারণ করবে

× 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>


10
কি দারুন. এতে জমা দেওয়া যে কোনও উত্তর আমার কাছ থেকে একটি স্বয়ংক্রিয় +1 পায়। দুটি আনুষ্ঠানিক ভাষা isomorphic কিনা তা নির্ধারণ করা যথেষ্ট কঠিন hard একজনের অন্যের সাবল্যাঞ্জুয়েজ কিনা তা নির্ধারণ করা সম্পূর্ণ সম্পূর্ণ স্নাতকোত্তর সিএস প্রকল্প। @ ___ @
কোতো

অবৈধ রেজেক্স প্যাটার্নগুলির জন্য কি কোনও নির্দিষ্ট আচরণ রয়েছে?
পল গিয়ট

@ পলগুইট নং আপনি অনুমান করতে পারেন যে নিদর্শনগুলি বৈধ।
Ell

1
আমি ভাবছি - আপনি কি নিজেরাই জিতেছেন (কোড গল্ফ প্রশ্নের পক্ষে এটি কতটা সম্ভব) তা আপনি লিখেছেন নাকি?
গর্বিত হাসেলেলার

1
পছন্দ করেছেন আমি পরীক্ষার স্নিপেট লিখেছিলাম। এটি একটি কঠিন চ্যালেঞ্জ, এবং এখানে কোনও ওয়ান-লাইনার হওয়ার কথা নেই, তবে এটি গল্ফযোগ্য।
এলো

উত্তর:


10

পাইথন 2, 522 বাইট * .92 = 480.24 537.28

সম্পাদনা 2 : -60 বাইট

সম্পাদনা : ব্যাখ্যা যুক্ত করা হয়েছে।

নির্ধারিত ফাংশন fযা আর্গুমেন্ট এবং আয় দুটি প্যাটার্ন স্ট্রিং লাগে '<', '=', '>', '|', অথবা 'X'। সমস্ত পরীক্ষার কেসগুলি প্রক্রিয়া করার জন্য এক মিনিটেরও কম সময় প্রয়োজন।

কোড নিম্নলিখিত নিয়ে গঠিত, কিন্তু সঙ্গে \r, \n \tএবং হেক্স বেরিয়ে (কিন্তু \0) তাদের প্রকৃত বাইট মান দিয়ে প্রতিস্থাপিত।

#encoding=Latin
exec"""x\xda]RMo\xdb0\x0c\xbd\xe7Wx\'K\x96\x92\xc5mOR\xb8\xdf1@%|\x98%X\x80a\x19\x96\x02\x03n\xf2\xdfG:i;\xec$\x92z|\x8f_\x1b\x84%m~\xca\xbe\x1c\x0e\xbd\x0fU\x10Agi\x0e\x87\xea\n\x1f\xf9n{=\xea\0\x93\x08\xd2\xaez\xd0\x99\xcc,m\x07g\xbb\x80s\x9b\x08\xee\x8cRo"\xf3\x8bHy!-\x95\xd7\xa9\x8aS\xb50O5\xc3&\xb68\x0b\xe7\xb1\x19t\x92\x8a\x1d\xaf]\xc2f\x94\x92\x111T\xf3\xf1j\xba\x1b\x081r\xa2\x97\xea\xa5\x11\x03\x9bI\xca\xe6\xed\xe7\xab\xbd\xde`\xb6\x8b"\xd1\xc5\xf7\xd7?^l\xa7\xaeKK\xd7i\x91\x92\x8b\xaaE\x16\x8e\x9c\x12#3\x86\xe0"\xc6\xc9\x15\xfd\x86\xae\\\xde\xcc^\xa7\x94;,\xea\x94t\x08\x84\xa6J\x82\xee%\xb1\xe8\xacW\xb9\xb3\x14f\xd9\x84\xeb\x89\xe1\x8b\xd5\xa3r\xeb\xbf\x81D\rS\xf5\x8b/\xd7e\xaao\xf0\xeb\xf2\xbbv\xdd\xf1\x15\x1f\x93\xe4Aq\xff\x19\xc6\x98\x8b\xa8E\xad\xb2\xaae-m\x843\xc5\xd7!\x8e\xbe\xca.\x1a4\x01\xe8E;@-\xe4\xad9\xd5\xa7\x10\xa7\x9eg\xcea\x10\x83\x0e\xd2\r\x973\xb2o\xb8\xd7\x06\xc2\x0f\xa8\xdf\xdfk\x1b\x15\xb4v\x84H\xc9\xad]\xc1\x83C;\x03m\xc3\x16p\x1f\xe3\x1d\xbf\xa4\xe2\xbe\x8d\x1eX)\x1e\t\x9dv\xf3\xa9\xcd\xe8xGU\x9e\x0b\t\x97\xd6\x0c\x8c\xf2\nxa\xa9\x19u\xaf\xf2iN3\r\xd1\xae\x0f\xe3\x13\x0c@h\xb5W\xb0\xaad3\xef\t\x91s]R=~\xc3^Lv\xc7\x16\x15\xf4\xfb\xa7\x88ze_~B\x06\x80\x99\x03\x86\x7f\x0bY\x06U\xd2.\xeaV\x95\x87$\xd1\xce\xff\x8b\xbf\x9a\x99\xe0\x03u\xa1 =o0<n\xd0\xef]s`b\xb7\x98\x89\xael\xd2\x85\xceO:>\x80j\xfa\xdeb\x95\x95k\x91N\xbe\xfc'5\xac\xe7\xe8\x15""".decode('zip')

উপরের বিবৃতিটি নিম্নলিখিত কোডটি কার্যকর করে:

z=frozenset
def f(f,s):
 u={s};d,l,f=n(f);w,h,s=n(s);_=0;r=[[z(f[0]),z(s[0])]]
 for e,o in r:
  p=z(zip([e]*h,o)+zip(e,[o]*l))
  if p-u:_|=((l in e)+2*(h in o))*4/3;u|=p;r+=[[reduce(z.__or__,(oo[i+1]for i in ii if ff[i]in[t,4][t<4:]),z())for ii,oo,ff in(e,f,d),(o,s,w)]for t in z([d[i]for i in e]+[w[i]for i in o])]
 return'|=><X'[_-3]
def n(s):
 s=list('('+s+')');i=0
 while s[i:]:f=s[i];h='()|*.'.find(f);s[i]=(h,f)[h<0];s[i:i+1]*=f!='\\';i+=1;l=i;h=1;w=e=[];p=[0];t=[{l}]
 while i:
  d=[i];i-=1;o=[i];f=s[i];t=[{i}]+t
  if f<1:h-=1;e+=zip(o*l,d+s.pop());w.pop()
  if f==1:h+=1;w=w+o;s+=[[]];e+=[o+d]
  if f==2:s[-1]+=d;e+=[(i,w[-1])]
  if h==p[-1]:e+=[t[-1:]+o,[i,1+t.pop()]];p.pop()
  if f==3:p+=[h];t+=o
 for f,o in e:
  for n in t:n|=(n,t[o])[f in n]
 return s+[1],l,t

যদি দ্বিতীয় কোডের নমুনা স্ট্রিংয়ে সঞ্চিত থাকে sতবে প্রথমটির মতো অনুরূপ কিছু এক্সপ্রেশন দ্বারা উত্পাদিত হতে পারে '#encoding=Latin\nexec"""%s"""'%__import__('zlib').compress(s)। কিছু অক্ষর যেমন নাল বাইট বা ব্যাকস্ল্যাশগুলি ঠিক করা প্রয়োজন হতে পারে। আনজিপড কোডটি প্রায় 1000 800 বাইট তাই সম্ভবত এটি গল্ফযুক্তের চেয়ে বেশি অবসন্ন ... তবে কমপক্ষে আমি কিছুটা এনকোডিংটি গল্ফ করতে পেরেছি: থেকে শুরু Latin1করে Latin

ব্যাখ্যা

প্রোগ্রামটি স্ট্রিংটির সূচকগুলি কোনও স্ট্রিংকে বিশ্লেষণের রাজ্যের উপর নজর রাখার অপরিশোধিত উপায় হিসাবে ব্যবহার করে কাজ করে। nফাংশন রূপান্তরটি টেবিল তৈরী করে। প্রথমে এটি স্ট্রিংকে পার্স করে এবং দুই ধরণের ট্রানজিশনের সমস্ত দৃষ্টান্ত খুঁজে পায়। প্রথমত, এমন ট্রানজিশন রয়েছে যা স্ট্রিংয়ে অন্য একটি চিঠি যুক্ত করা জড়িত না। উদাহরণস্বরূপ, *একটি পরিমানযুক্ত অভিব্যক্তির শুরুতে লাফ দেওয়া । দ্বিতীয়ত, একটি অক্ষর যুক্ত করার ট্রানজিশন রয়েছে, যা কেবল একটি সূচক দ্বারা এগিয়ে যায়। তারপরে নো-চরিত্রের রূপান্তরগুলির সংক্রামক সমাপ্তি গণনা করা হয় এবং সেগুলি 1-চরিত্রের রূপান্তরগুলির গন্তব্যের জন্য প্রতিস্থাপিত হয়। সুতরাং এটি সূচকগুলির একটি মানচিত্র এবং সূচকগুলির একটি সেটকে একটি অক্ষর প্রদান করে।

মূল ফাংশন সম্ভাব্য ইনপুট স্ট্রিংগুলির উপর একটি বিএফএস করে। এটি স্ট্রিংয়ের যে কোনও খণ্ড বিবেচনা করছে তার জন্য সমস্ত সম্ভাব্য সূচকের একটি সেট ট্র্যাক করে। আমরা যে সন্ধানে আগ্রহী তা হ'ল রাজ্যগুলি হয় হয় উভয়ই রেজেক্স দ্বারা মেনে নেওয়া হয়, বা একটি দ্বারা এবং অন্যের দ্বারা নয়। একটি রেজেক্স গৃহীত হয়েছে তা দেখানোর জন্য, প্যাটার্নের শেষের দিকে ট্রানজিশনের একটি সম্ভাব্য পথ খুঁজে পাওয়া দরকার। তবে এটিকে যে প্রত্যাখ্যান করা হয়েছে তা দেখাতে সমস্ত সম্ভাব্য পথ বিশ্লেষণ করা প্রয়োজন। অতএব, প্যাটার্ন এ এবং প্যাটার্ন বি এর জন্য সম্ভাব্য রাজ্যের সেটগুলি ইতিমধ্যে বিশ্লেষণ করা হয়েছে এমনগুলির দ্বারা ইতিমধ্যে আচ্ছাদিত রয়েছে কিনা তা নির্ধারণ করার জন্য, একটি রেজেক্সে একটি একক রাষ্ট্রের জোড়া এবং অন্যটিতে সমস্ত সম্ভাব্য রাজ্যের সেট রেকর্ড করা হয় কিনা। যদি কোনও নতুন না থাকে তবে ফিরে যাওয়া ঠিক হবে। অবশ্যই, এটিও সম্ভব হবে এবং কম অক্ষর,


খুব সুন্দর! এ এবং বি গ্রুপে সমস্ত পরীক্ষায় উত্তীর্ণ হয় (কোনও অক্ষরের শ্রেণি নেই, মনে হয় work) আমি কাজ করার জন্য সংক্ষেপিত সংস্করণটি পেতে পারি না বা একই বাইট গণনাটি পাই। যেভাবেই হোক, আপনি x 0.92যখন নিজের স্কোরটি গণনা করেন তখন আপনি বোনাসটি দাবি করতে পারেন । এবং, অবশ্যই, একটি ব্যাখ্যা স্বাগত!
ইলে

4

হাস্কেল, 560 553 618

ভবিষ্যতে বোনাস কিছু পেতে পারে।

এটি এখনও পুরোপুরি গল্ফ হয় না।

import Data.List
c%j|'\\':h:s<-j=[s|c==h]|(a,b):_<-[(a,b)|x<-[0..length j],(a,'|':b)<-[splitAt x j],snd(k b)==[]]=c%a++c%b|'(':s<-j,(a,_:'*':b)<-k s=map(++j)(c%a)++c%b|'(':s<-j,(a,_:b)<-k s=map(++b)(c%a)|h:'*':s<-j=map(++j)(c%[h])++c%s
c%"."=[""|c>'\0']
c%s@[_]=c%('\\':s)
c%(a:b)=map(++b)(c%[a])
c%s=[""|c>'\0']
a&b=nub[(x,nub$b>>=(c%))|c<-[' '..'~'],x<-c%a]
g e(k@(a,l):r)|j<-a&l\\e=g(k:e)(j++r)
g e[]=e
a#b=or[all(null.('\0'%))m|(x,m)<-g[][(a,[b])],""<-'\0'%x]
a!b|a#b,b#a='x'|a#b='>'|b#a='<'|0<1='='
k"("=("","(")
k(c:s)|'('<-c,(x,y)<-k$tail b=('(':a++')':x,y)|')'<-c=("",')':s)|0<1=(c:a,b)where(a,b)=k s
k j=(j,j)

অ্যালগরিদমের একটি হাত-avyেউয়ের ব্যাখ্যা:

reg!reg' প্রয়োজনীয় চরটি, "= <> x" এর মধ্যে একটি প্রদান করে।

a#bসত্য তবে যদি প্রতিটি স্ট্রিং aমেলে না তবে এটিও মেলে b

c%regআউটপুট ম্যাচগুলির মধ্যে অন্যতম যদি রেজিপ্সে regমেলে c:sতবে নিয়মিত এক্সপ্রেশনগুলির একটি তালিকা s। আমি মূলত আংশিকভাবে রেজেক্সের সাথে মেলে। বাদে যদি cহয় '\0'। তারপরে এটি আর regকোনও ইনপুট না পাওয়ার জন্য বাধ্য করে, ফিরে আসতে []হলে regআরও বেশি ইনপুট পাওয়া উচিত [""]অন্যথায়।

#সম্ভাব্য সমস্ত "রেজেক্স-স্টেট" এর সসীম তালিকা তৈরি করে কাজ করে দুটি রেজিএক্সপস একটি স্বেচ্ছাসেবী স্ট্রিংয়ের পরে আসবে। তারপরে যদি a<bআমরা আবহাওয়া পরীক্ষা করি তবে সেখানে একটি "রেজেক্স-স্টেট" রয়েছে যা aপুরোপুরি ম্যাচ হয়েছে তবে bপুরোপুরি মেলে না।


শান্ত! আপনি অবশ্যই সঠিক পথে আছেন তবে, এখনই এটি পরীক্ষায় ব্যর্থ B4
Ell
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.