একটি রেজেক্স বিপরীত


27

চ্যালেঞ্জ

একটি বৈধ regex দেওয়া, আউটপুট একটি regex যা একই স্ট্রিং এর সেট সেট, কিন্তু বিপরীত।

কাজটি

এই চ্যালেঞ্জ সবচেয়ে মৌলিক Regex অপারেশন ব্যবহার করে: ^, $, ?, +, *, [], {}, |। ক্যাপচার গ্রুপ বা সেই জটিল স্টাফগুলির মতো কোনও জিনিস নেই। বিশেষ চরিত্রগুলি এড়ানো যেতে পারে।

নমুনা ইনপুট / আউটপুট

দ্রষ্টব্য: অবৈধ ইনপুট কখনই দেওয়া হবে না এবং প্রদত্ত ইনপুটটির জন্য সাধারণত একাধিক সম্ভাব্য উত্তর থাকে!

Input      | Sample Output
-----------|-------------
abc        | cba
tuv?       | v?ut
a(b|c)     | (c|b)a
1[23]      | [23]1
a([bc]|cd) | (dc|[bc])a
^a[^bc]d$  | ^d[^bc]a$
x[yz]{1,2} | [yz]{1,2}x
p{2}       | p{2}
q{7,}      | q{7,}
\[c[de]    | [de]c\[
ab[c       | <output undefined>
a(?bc)     | <output undefined>
a[]]bc     | <output undefined>

ডেমো

ওয়ার্কিং ডেমো যা সঠিক ইনপুট / আউটপুট প্রদর্শন করে। ইনপুটগুলি বৈধকরণের জন্য এটিতে কিছু অতিরিক্ত যুক্তি রয়েছে যা আসল উত্তরের জন্য প্রয়োজনীয় নয়। অবৈধ ইনপুটগুলি অপরিজ্ঞাত আচরণ হিসাবে বিবেচনা করুন।

সুনির্দিষ্ট

সরলতার জন্য, সমস্ত বিশেষ অক্ষরের হয় তাদের বিশেষ অর্থ হয় বা পালিয়ে যায়; এটি হল, [[]কোনও চরিত্রের জন্য নয় [। দৈর্ঘ্যের ব্যাপ্তিগুলি স্ট্যান্ডার্ড পসিক্স পূর্ব থেকে আসে; যে {n}, {n,}এবং {n,m}সমর্থিত। চরিত্র পরিসীমা []এবং [^]সমর্থিত। এই নিয়মগুলির কারণে এবং যেহেতু কোনও অবৈধ ইনপুট দেওয়া হয়নি, আপনার সত্যিকারের কেবলমাত্র আউটপুটে সরাসরি এই বিষয়বস্তু অনুলিপি করা প্রয়োজন। শেষ অবধি, লোভ কিছু বিবেচনা করে না, অর্থাৎ বিপরীত রেজেক্স প্রথমে আলাদা ম্যাচটি আবিষ্কার করে তা বিবেচনা করে না , কেবল একই স্ট্রিংয়ের জন্য একটি ম্যাচ খুঁজে পাওয়া দরকার।

স্কোরিং

বাইটের ক্ষুদ্রতম প্রোগ্রাম (নেটওয়ার্ক অনুরোধের মতো প্রতারণা বাদ দিয়ে) জয়ী হয়। প্রোগ্রাম হয় হয় আসল IO ব্যবহার করতে পারেন বা কেবল একটি ফাংশন সংজ্ঞায়িত করতে পারেন।


1
কারণ ?সংযুক্ত করার মতো কিছুই নেই । /a(?bc)/ব্রাউজারের কনসোলে টাইপ করার চেষ্টা করুন ।
TND

3
ভাল লাগছে এখন। আপনি (^a|b)(c$|d)যদিও পরীক্ষার কেস হিসাবে কিছু যুক্ত করতে চাইবেন ।
মার্টিন ইন্ডার

আমরা কি ধরে নিতে পারি যে ইনপুটটিতে কেবল প্রিন্টযোগ্য ASCII অক্ষর থাকবে? বিশেষত, কোন লাইনফিড অক্ষর নেই?
মার্টিন ইন্ডার

1
আমাদের কি গ্রুপে প্রয়োগ করা (a)?(b)+বাছাইকারীদের বিবেচনা করা উচিত ↦ (b)+(a)??
কেনেটিএম

1
আপনার রেজেক্স অপারেশনের তালিকাটি অনুপস্থিত (), যা আপনার উদাহরণে ব্যবহৃত হয়।
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

উত্তর:


7

রেটিনা , 136 114 110 বাইট

হ্যাঁ, আমি শুনেছি তোমাকে রেজিএক্সের মতো ...

^
;
(T`^$`$^`;.
(.*);(\[(\\.|[^]])*]|\\.|.)([*+?]|{\d+(,|,\d+)?})?
$2$4!$1;
^\(!
) 
^\)(.*)!(.+?) 
($2$1
;$|!
<empty>

যেখানে <empty>একটি খালি ট্রেলিং লাইন উপস্থাপন করে। -sপতাকা সহ একটি ফাইল থেকে কোড চালান Run

... আপনি যখন রেগেক্স রিভার্স করতে চান তখন আপনার উচিত হবে রেজেক্স use আপনি যখন রেজেক্স ব্যবহার করতে চান তখন আপনার একটি রেইগেক্স-ভিত্তিক প্রোগ্রামিং ভাষা ব্যবহার করা উচিত।

এই কোড অনুমান ইনপুট রয়েছে তন্ন তন্ন করে ;না !কিংবা স্পেস। যদিও আমি সম্মত হলাম যে এটি একটি শক্তিশালী এবং সম্ভাব্য অবৈধ অনুমান, আপনি কোডটিতে এই তিনটি কোনও অপ্রিন্টযোগ্য অক্ষর (যেমন নাল বাইটস, বেল চরিত্র, <DEL>আপনি নাম দিয়েছিলেন) দিয়ে প্রতিস্থাপন করতে পারেন , এবং এটি কোডের আকার বা কার্যকারিতা প্রভাবিত করবে না মোটেই

আমি যখন গল্ফিং করি তখন আমি একটি ব্যাখ্যা যুক্ত করব।



আমি মনে করি কোডটিও ধরে নিয়েছে যে রেজেক্সে কোনও কাঁচা নতুন লাইনের অক্ষর নেই।
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳ ওহ, এটি সত্য, আমি অনুমানের মধ্যে ছিলাম যে ইনপুটটিতে কোনও ছাপিয়ে অক্ষর থাকবে না। আমি ঠিক করব যে একবার আমরা ওপি থেকে স্পষ্টতা পাই। (যদি কোনও চরিত্র হাজির হতে পারে, এখনও কিছু নির্দিষ্ট সংমিশ্রণ রয়েছে যা এই চ্যালেঞ্জটি বৈধ রেইজেক্স হিসাবে বিবেচিত হবে তার মধ্যে প্রদর্শিত হবে না, উদাহরণস্বরূপ ]]], সুতরাং যে কোনও উপায়েই , এই উত্তরটির খুব বেশি সংশোধন করার প্রয়োজন হবে না
Mart

এক বছরেরও বেশি সময় পরে গল্ফিং করেছি? : পি
Okx

2

জাভাস্ক্রিপ্ট ES6, 574 বাইট

আমি সম্ভবত কয়েকটি varবিবৃতি সরাতে পারি ।

R=e=>{for(var s=0,c=[],h=/(\?|\+|\{\d*,*\d*\}|\*)(\?*)/,t=0;t<e.length;t++)switch(s){case 0:switch(e[t]){case"\\":t++,c.push("\\"+e[t]);break;case"[":j=t,s=1;break;case"(":k=t,s=2;break;default:var l=e.search(h,t);(l>=t+1||0>l)&&c.push(l==t+1?e[t]+e.slice(t,e.length).match(h)[0]:e[t])}break;case 1:"\\"==e[t]?t++:"]"==e[t]&&(c.push(e.slice(j,t+1)+(e.search(h,t)==t+1?e.slice(t,e.length).match(h)[0]:"")),s=0);break;case 2:"\\"==e[t]?t++:")"==e[t]&&(a=R(e.slice(k+1,t)),c.push("("+a+")"),s=0)}c.reverse(),r=c;var i=c.length-1;return"^"==c[i]&&(r[i]="$"),"$"==c[0]&&(r[0]="^"),r.join``}}

জেএস ইএস 6, অনির্ধারিত, 559 বাইট

ঘরে বসে পরীক্ষা দিবে।

R=e=>{for(s=0,c=[],h=/(\?|\+|\{\d*,*\d*\}|\*)(\?*)/,t=0;t<e.length;t++)switch(s){case 0:switch(e[t]){case"\\":t++,c.push`\\${e[t]}`;break;case"[":j=t,s=1;break;case"(":k=t,s=2;break;default:l=e.search(h,t);(l>=t+1||0>l)&&c.push(l==t+1?e[t]+e.slice(t,e.length).match(h)[0]:e[t])}break;case 1:"\\"==e[t]?t++:"]"==e[t]&&(c.push(e.slice(j,t+1)+(e.search(h,t)==t+1?e.slice(t,e.length).match(h)[0]:"")),s=0);break;case 2:"\\"==e[t]?t++:")"==e[t]&&(a=R(e.slice(k+1,t)),c.push`(${a})`,s=0)}c.reverse(),r=c;i=c.length-1;return"^"==c[i]&&(r[i]="$"),"$"==c[0]&&(r[0]="^"),r.join``}}

জাভাস্ক্রিপ্ট ইএস 5, অবরুদ্ধ, 961 বাইট

function revRegex(str){
 var mode = 0;
 var oS = [];
 var post = /(\?|\+|\{\d*,*\d*\}|\*)(\?*)/;
 for(var i=0;i<str.length;i++){
  switch(mode){
   case 0: switch(str[i]){
    case "\\": i++; oS.push("\\"+str[i]); break;
    case "[": j=i; mode = 1; break;
    case "(": k=i; mode = 2; break;
    default:
     var pLoc = str.search(post,i);
     if(pLoc>=i+1||pLoc<0){ // current is not pLoc
      if(pLoc==i+1){
       oS.push(str[i] + str.slice(i,str.length).match(post)[0]);
      } else {
       oS.push(str[i]);
      }
     }
   }; break;
   case 1: if(str[i]=="\\") i++; else if(str[i]=="]"){oS.push

(str.slice(j,i+1)+(str.search(post,i)==i+1?str.slice

(i,str.length).match(post)[0]:""));mode = 0}; break;
   case 2: if(str[i]=="\\") i++; else if(str[i]==")")

{a=revRegex(str.slice(k+1,i));oS.push("("+a+")");mode = 

0};break;
  }
 }
 oS.reverse();
 r=oS;
 var l=oS.length-1;
 if(oS[l]=="^") r[l]="$";
 if(oS[0]=="$") r[0]="^";
 return r.join("");
}

5
হ্যাঁ, আপনি
রিজেক্সকে

3
@ ΚριτικσιΛίθος হ্যাঁ, আমি করেছি: ডি আমি এটি ব্যবহার করতে পারতাম HTML টি পার্স করার জন্য ...
কনর ও'ব্রায়ান

4
"যদি আপনি পারেন"
অপটিমাইজার

1
@ সিও'বাʀɪᴇɴ আমি রেইগেক্সের সাথে এইচটিএমএল কোডগুলি পার্স করেছিলাম তবে ইউনিকোড অক্ষর নিয়ে একটি গুরুতর সমস্যা পেয়েছি
Abr001am

2
@ সিওওবিʀɪᴇɴ এটি বিকল্প:। কোড.replace (/.*//, "ট্রললল");
ক্রিটসি লিথোস

2

জাভাস্ক্রিপ্ট ES6, 343 বাইট

t=r=>(u="substr",T="(?:[+?*]|{\\d+(?:,\\d*)?})?)([^]*)",(c=r[0])=="(")?([n,s]=v(r[u](1)),[_,q,s]=s.match("^(\\)"+T),["("+n+q,s]):c==")"||c==null?["",r]:c=="^"?["^",r[u](1)]:c=="$"?["^",r[u](1)]:r.match("^("+/(?:\[(?:[^\]\\]|\\[^])*\]|[^[\\]|\\[^])/.source+T).slice(1);(v=r=>{var o="";do{[n,r]=t(r);o=n+o;}while(n&&r);return[o,r]})(prompt())[0]

আসল কোড (ফাংশন, কিন্তু ছাড়া prompt):

function reverse(regex) {
    var out = "";
    do {
        // console.log("calling term");
        var [node, regex] = term(regex);
        // console.log("reverse: " + [node, regex]);
        out = node + out;
    } while (node && regex);
    return [out, regex];
}

function term(regex) {
    switch (regex[0]) {
        case "(":
            // console.log("calling reverse");
            var [node, sequel] = reverse(regex.substr(1));
            // console.log("term: " + regex + " / " + [node, sequel]);
            var [_, quantifier, sequel] = sequel.match(/^(\)(?:[+?*]|{\d+(?:,\d*)?})?)([^]*)/);
            return ["(" + node + quantifier, sequel];
        case ")":
        case void 0:
            return ["", regex];
        case "^":
            return ["$", regex.substr(1)];
        case "$":
            return ["^", regex.substr(1)];
        default:
            return regex.match(/^((?:\[(?:[^\]\\]|\\[^])*\]|[^[\\]|\\[^])(?:[+?*]|{\d+(?:,\d+)?})?)([^]*)/).slice(1);
    }
}

reverse("^\\(([The(){}*\\] ]{2,3}world\\\\(begin(ner|ning)?|ends*)+|Con\\|ti\\*n\\)ue...[^%\\[\\]()\\\\])$")[0]

কোডটি পুনরাবৃত্তির শীর্ষ-ডাউন পার্সার হিসাবে প্রয়োগ করা হয়েছে, সুতরাং এটি গভীরভাবে নেস্টেড ইনপুটটিতে স্ট্যাক ওভারফ্লো হতে পারে।

কোডটি অবৈধ ক্ষেত্রে অসীম লুপের কারণ হতে পারে, যেহেতু আমি "অপরিবর্তিত আচরণ" ধারাটির সুবিধা নিয়ে তাদের পরীক্ষা করি না।


0

পাইথন 3, 144 বাইট

(এটি কোনও গ্রুপের মতো বাছাইপর্বে সমর্থন করে না(a)+(b)*(cde)? ))

import re;f=lambda x:''.join({e:e,'^':'$','$':'^','(':')',')':'('}[e]for e in re.findall(r'(?:\\.|\[(?:\\?.)+?\]|.)(?:[?+*]|\{.+?\})?',x)[::-1])

পরীক্ষার কেস:

test_cases = [
    # Provided test cases
    r'abc',
    r'tuv?',
    r'a(b|c)',
    r'1[23]',
    r'a([bc]|cd)',
    r'^a[^bc]d$',
    r'x[yz]{1,2}',
    r'p{2}',
    r'q{7,}',
    r'\[c[de]',

    # Pathological cases
    r'a{3}b',
    r'(a)?(b)+',            # <-- currently failing!
    r'[\[]{5}[^\]]{6}',
    r'[\[]\]{7}',
    r'[\[\]]{8,9}',
    r'\(\)\^\$',

    # Undefined cases
    r'ab[c',
    r'a(?bc)',
    r'a[]]bc',
]

for t in test_cases:
    print(t, '->', f(t))

ফলাফল:

abc -> cba
tuv? -> v?ut
a(b|c) -> (c|b)a
1[23] -> [23]1
a([bc]|cd) -> (dc|[bc])a
^a[^bc]d$ -> ^d[^bc]a$
x[yz]{1,2} -> [yz]{1,2}x
p{2} -> p{2}
q{7,} -> q{7,}
\[c[de] -> [de]c\[
a{3}b -> ba{3}
(a)?(b)+ -> )+b))?a)                    # <-- note: wrong
[\[]{5}[^\]]{6} -> [^\]]{6}[\[]{5}
[\[]\]{7} -> \]{7}[\[]
[\[\]]{8,9} -> [\[\]]{8,9}
\(\)\^\$ -> \$\^\)\(
ab[c -> c[ba
a(?bc) -> (cb(?a
a[]]bc -> cb[]]a
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.