বিপরীতে রেজেক্স - নিয়মিত এক্সপ্রেশনগুলি পচন করুন


17

সমস্যাটি

আমার কিছু সংখ্যক নিয়মিত এক্সপ্রেশন রয়েছে যা আমার কিছু কোডে ব্যবহার করা দরকার তবে আমি এমন একটি প্রোগ্রামিং ভাষা ব্যবহার করছি যা রেজেক্সকে সমর্থন করে না! ভাগ্যক্রমে, আমি জানি যে পরীক্ষার স্ট্রিংয়ের সর্বাধিক দৈর্ঘ্য হবে এবং এটি কেবল মুদ্রণযোগ্য এএসসিআইআই দ্বারা গঠিত।

চ্যালেঞ্জ

আপনি ইনপুট করা আবশ্যক একটি Regex এবং একটি সংখ্যা n, এবং আউটপুট মুদ্রণযোগ্য হওয়া ASCII (ASCII কোড 32 126 সমেত চাই, গঠিত যে স্ট্রিং থেকে ~কম বা সমান দৈর্ঘ্যের, কোন ট্যাব বা নতুন লাইন) nযে মিলগুলি Regex। আপনি নিজের কোডে বিল্ট-ইন নিয়মিত এক্সপ্রেশন বা রেজেক্স ম্যাচিং ফাংশনগুলি ব্যবহার করতে পারেন না । নিয়মিত প্রকাশগুলি নিম্নলিখিতগুলির মধ্যে সীমাবদ্ধ থাকবে:

  • আক্ষরিক অক্ষর (এবং পলায়ন, যা একটি চরিত্রকে আক্ষরিক হতে বাধ্য করে, তেমনি \.একটি আক্ষরিক ., \nআক্ষরিক n(ন্যায়বিচারের সমতুল্য n), এবং \wএর সমতুল্য w। আপনাকে পালানোর ক্রমগুলি সমর্থন করার দরকার নেই।)
  • . - ওয়াইল্ডকার্ড (যে কোনও চরিত্র)
  • চরিত্রের ক্লাস, [abc]অর্থ "এ বা বি বা সি" এবং এর [d-f]অর্থ ডি থেকে এফ (তাই, ডি বা ই বা এফ) এর কোনও কিছুই। অক্ষর শ্রেণীর একমাত্র অক্ষর যার বিশেষ অর্থ রয়েছে [এবং ](যা সর্বদা পালিয়ে যাবে, সুতরাং সেগুলি সম্পর্কে চিন্তা করবেন না), \(পালানোর চরিত্রটি অবশ্যই) ^অক্ষর শ্রেণীর শুরুতে (যা একটি প্রত্যাখ্যান ), এবং -(যা একটি ব্যাপ্তি)
  • |- ওআর অপারেটর, বিকল্প। foo|barএর অর্থ হয় হয় fooবা bar, এবং (ab|cd)eমেলে abeবা হয় cde
  • * - পূর্বের টোকেনটি পুনরাবৃত্তি শূন্য বা তার বেশি বার মিলিয়ে, লোভী (এটি যতবার সম্ভব পুনরাবৃত্তি করার চেষ্টা করে)
  • + - এক বা একাধিকবার পুনরাবৃত্তি, লোভী
  • ? - শূন্য বা এক বার
  • জন্য প্রথম গ্রুপে টোকেন করা |, প্রথম বন্ধনীর সাথে গ্রুপিং *+, বা?

ইনপুট Regex সবসময় কার্যকর থাকবে (অর্থাত, তোমার মত ইনপুট হ্যান্ডেল করতে হবে না ?abcবা (fooবা কোন অবৈধ ইনপুট)। আপনি যে কোনও ক্রমে স্ট্রিংগুলি আউটপুট দিতে পারেন, তবে প্রতিটি স্ট্রিং অবশ্যই একবার উপস্থিত হবে (কোনও ডুপ্লিকেট আউটপুট করবেন না)।

টেস্ট কেস

ইনপুট: .*, 1
আউটপুট: (খালি স্ট্রিং), , !, ", ..., },~

ইনপুট: w\w+, 3
আউটপুট: ww,www

ইনপুট: [abx-z][^ -}][\\], 3
আউটপুট: a~\, b~\, x~\, y~\,z~\

ইনপুট: ab*a|c[de]*, 3
আউটপুট: c, cd, ce, aa, cde, ced, cdd, cee,aba

ইনপুট: (foo)+(bar)?!?, 6
আউটপুট: foo, foo!, foofoo,foobar

ইনপুট: (a+|b*c)d, 4
আউটপুট: ad, cd, aad, bcd, aaad,bbcd

ইনপুট: p+cg, 4
আউটপুট: pcg,ppcg

ইনপুট: a{3}, 4
আউটপুট:a{3}

বিজয়ী

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জিতবে!


আমাদের কি পালানোর ক্রম সমর্থন করার অনুমতি দেওয়া হচ্ছে? তাহলে এটি তুচ্ছ।
জন ডিভোরাক

3
আপনার ব্যাখ্যাটি |খুব সামান্যই বোঝায়। এটি নেস্টেড গ্রুপগুলি বা পরিচালনা করার জন্য বলে মনে হচ্ছে না a|b|c। স্ট্যান্ডার্ড ব্যাখ্যাগুলি কীভাবে দৃaten়ভাবে সংমিশ্রণ এবং বিকল্প বাঁধাইয়ের ক্ষেত্রে ব্যবহার করে ভুল হয়েছে? (এবং আপনার স্যান্ডবক্সটি ব্যবহার না করার কোনও অজুহাত নেই)
পিটার টেলর

1
@ পিটারটেলর আসলে, তার একটি অজুহাত রয়েছে: meta.codegolf.stackexchange.com/q/1305/9498
জাস্টিন

2
আপনার প্যাটার্ন দিয়ে বিচার করে পুরো স্ট্রিংটির সাথে মিল রাখতে হবে? (একটি স্ট্রাস্টিংয়ের বিপরীতে)
মার্টিন এেন্ডার

3
@ কাইলকানোস এটি একটি লজ্জাজনক সত্যিকারের সমস্যা যা আপনাকে নিয়মিত ভাব প্রকাশ করার কথা মনে করে না। : পি তবে এগুলি তাদের মতো সহজে
মার্টিন

উত্তর:


8

হাস্কেল 757 705 700 692 679 667

import Data.List
data R=L Char|A R R|T R R|E
h=[' '..'~']
k(']':s)a=(a,s)
k('^':s)_=l$k[]s
k('-':c:s)(a:b)=k([a..c]++b)s
k('\\':c:s)a=k s$c:a
k(c:s)a=k s$c:a
l(a,b)=(h\\a,b)
c#E=L c
c#r=A(L c)r
o(a,b)=(foldr(#)E a,b)
t%0=E
t%n=A(t%(n-1))$T t$t%(n-1)
d s n=m(fst$r s)[[]] where{m E a=a;m(L c)a=[b++[c]|b<-a,length b<n];m(A r s)x=nub$(m r x)++m s x;m(T r s)a=m s$m r a;r s=w$e s E;w(u,'|':v)=(\(a,b)->(A u a,b))$r v;w x=x;e(')':xs)t=(t,xs);e s@('|':_)t=(t,s);e s@(c:_)t=g t$f$b s;e[]t=(t,[]);g t(u,v)=e v$T t u;f(t,'*':s)=(t%n,s);f(t,'+':s)=(T t$t%n,s);f(t,'?':s)=(A t E,s);f(t,s)=(t,s);b('(':s)=r s;b('\\':s:t)=(L s,t);b('.':s)=o(h,s);b('[':s)=o$k s[];b(s:t)=(L s,t)}

আউটপুট:

ghci> d ".*" 1
[""," ","!","\"","#","$","%","&","'","(",")","*","+",",","-",".","/","0","1","2","3","4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","[","\\","]","^","_","`","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","{","|","}","~"]
ghci> d "w\\w+" 3
["ww","www"]
ghci> d "[abx-z][^ -}][\\\\]" 3
["x~\\","y~\\","z~\\","b~\\","a~\\"]
ghci> d "ab*a|c[de]*" 3
["aa","aba","c","ce","cd","cee","cde","ced","cdd"]
ghci> d "(foo)+(bar)?!?" 6
["foo!","foobar","foo","foofoo"]
ghci> d "(a+|b*c)d" 4
["ad","aad","aaad","cd","bcd","bbcd"]
ghci> d "p+cg" 4
["pcg","ppcg"]
ghci> d "a{3}" 4
["a{3}"]

ব্যাখ্যা: এটি হ'ল পাঠ্যপুস্তকটির পুনরায় বাস্তবায়ন। আর রিগেক্স টাইপ, কনস্ট্রাক্টর এ (বিকল্প), এল (আক্ষরিক), টি (তারপরে) এবং ই (খালি / এপসিলন) দিয়ে। স্বাভাবিক 'স্টার' উপস্থিত হয় না কারণ আমি পার্সের সময় এটি বিকল্প হিসাবে ইনলাইন করি (দেখুন '%')। 'এম' সিমুলেশন চালায়। পার্সার ('আরএস = ....' এ শুরু) কেবল পুনরাবৃত্ত বংশোদ্ভূত; 'কে' পার্স রেঞ্জ। ফাংশন '#' বিস্তৃতিতে বিস্তৃত হয়।


9

পাইথন ভি 2.7 1069 1036 950 925 897 884 871 833 822

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

দুটি প্রধান ফাংশন হ'ল যেটি রেগেক্সকে পঞ্চম অক্ষর fথেকে শুরু করে পার্স করে iএবং dযা rপুনরায় পুনর্গঠন করতে পারে এমন উপ-রেজিক্সগুলি ব্যবহার করে মিলিত স্ট্রিংগুলি উত্পন্ন করে , 'এ' বর্তমান সাব-রেজেক্সের অংশটি উপস্থাপন করে যা এখনও প্রক্রিয়াজাত নয়, এবং একটি স্ট্রিং প্রত্যয়s যা এখন পর্যন্ত উত্পন্ন উত্পন্ন স্ট্রিংয়ের অংশকে উপস্থাপন করে।

এছাড়াও চেক আউট নমুনা আউটপুট এবং পরীক্ষা সাজ

import sys;V=sys.argv;n=int(V[2]);r=V[1];S=len;R=range;C=R(32,127)
Z=[];z=-1;D='d(r,p,';F='for j in '
def f(i,a):
 if i>=S(r):return a,i
 c=r[i];x=0;I="|)]".find(c)
 if c in"([|":x,i=f(i+1,Z)
 if I+1:return([c,a,x],[a],[c,a])[I],i
 if'\\'==c:i+=1;x=c+r[i]
 return f(i+1,a+[x or c])
def d(r,a,s):
 if S(s)>n:return
 while a==Z:
        if r==Z:print s;return
        a=r[z];r=r[:z]
 e=a[z];p=a[0:z]
 if'|'==a[0]:d(r,a[1],s);d(r,a[2],s)
 elif']'==a[0]:
        g=a[1];N=g[0]=='^';g=(g,g[1:])[N];B=[0]*127;O=[ord(c[z])for c in g]
        for i in R(0,S(g)):
         if'-'==g[i]:exec F+'R(O[i-1],O[i+1]):B[j]=1'
         else:B[O[i]]=1
        for c in C:N^B[c]<1or d(r,Z,chr(c)+s)
 elif' '>e:d(r+[p],e,s)
 else:c=p[:z];exec{'.':F+'C:'+D+'chr(j)+s)','?':D+'s);d(r,p[:z],s)','*':F+'R(0,n+1):d(r,c,s);c+=[p[z]]','+':"d(r,p+['*',p[z]],s)"}.get(e,D+'e[z]+s)')
d(Z,f(0,Z)[0],"")

নোট করুন যে মূল সমাধানের ট্যাবগুলি সম্পাদনা করা হয়েছে expand। মূল ব্যবহারের ক্ষেত্রে অক্ষরের সংখ্যা গণনা করা unexpand < regex.py | wc


9
আমি কখনোই পাইথন বর্ণন দেখা করেছি যে ভয়ঙ্কর।
ব্যবহারকারী 80551

তুমি কি পরিবর্তন করতে পারি def E(a,b):c=a[:];c.extend(b);return cকরতে E=lambda a,b:a[:].extend(b), Ditto জন্যA
user80551

আপাতদৃষ্টিতে না, যেমন .extend (খ) কোনও কিছুই ফেরায় না।
gmatht

1
এর জন্য elif isinstance(e,str):, আমি বিশ্বাস করি আপনি কোডটির অভ্যন্তরে এই পরিবর্তন করতে পারবেন: exec{'.':'for c in C:d(r,p,s+chr(c))','?':'d(r,p,s);d(r,p[:z],s)','*':'''c=p[:z]#newline for i in R(0,n+1):d(r,c,s);c+=[p[z]]''','+':"d(r,p+['*',p[z]],s)",'\\':'d(r,p,e[1]+s)'}.get(e,'d(r,p,e+s)')(লক্ষ্য করুন যে এটি #newlineএকটি নতুন লাইন) (উত্স: stackoverflow.com/a/103081/1896169 )
জাস্টিন

1
যদি আপনি এক্সিকিউট ট্রিকটি ব্যবহার করতে আরও জায়গা খুঁজে পেতে পারেন তবে আমরা সহজেই আপনার কোডটি অপঠনযোগ্য কোডে পরিবর্তন করতে পারতাম :-)
জাস্টিন

1

প্রোলোগ (এসডাব্লুআই) , 590 বাইট

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

R-L-S:-R*A,-(B,A,[]),setof(Z,(0/L/M,length(C,M),C+B+[],Z*C),S).
-R-->e+S,S-R.
R-T-->{R=T};"|",e+S,u+R+S-T.
Z+Y-->(".",{setof(C,32/126/C,R)};"[^",!,\E,"]",{setof(C,(32/126/C,\+C^E),R)};"[",\R,"]";"(",-R,")";{R=[C]},([C],{\+C^`\\.[|+?*(`};[92,C])),("*",{S=k(R)};"+",{S=c+R+k(R)};"?",{S=u+e+R};{S=R}),({Y=c+Z+S};c+Z+S+Y).
\C-->{C=[H|T]},+H,\T;{C=[]};+A,"-",+B,\T,{setof(C,A/B/C,H),append(H,T,C)}.
+C-->[92,C];[C],{\+C^`\\]-`}.
S+e+S.
[C|S]+D+S:-C^D.
S+(B+L+R)+T:-B=c,!,S+L+U,U+R+T;S+L+T;S+R+T.
S+k(K)+U:-S=U;S+K+T,S\=T,T+k(K)+U.
A/B/C:-between(A,B,C).
A^B:-member(A,B).
A*B:-string_codes(A,B).

-\3রেজেক্সের সাথে মিলে থাকা স্ট্রিংগুলি উত্পন্ন করার জন্য ইনস্ট্যান্টিয়েটেড দুটি আর্গুমেন্টের সাহায্যে প্রাকটিকেটটি ডাকা যেতে পারে।

?- "[abx-z][^ -}][\\\\]"-3-S.
S = ["a~\\"] ;
S = ["b~\\"] ;
S = ["x~\\"] ;
S = ["y~\\"] ;
S = ["z~\\"] ;
false.

এটি অনলাইন চেষ্টা করুন!

অবহেলিত কোড

generate_string(R, L, S) :-
    % parse regex
    string_codes(R, RC),
    regex_union(RE, RC, []),

    % bound string length
    between(0, L, M),
    length(SC, M),

    % find string
    match(SC, RE, []),

    string_codes(S, SC).

% Parsers
%%%%%%%%%  

regex_union(R) -->regex_concat(S), regex_union1(S, R).

regex_union1(R,T) --> [124], regex_concat(S), regex_union1(regex_union(R,S), T).
regex_union1(R, R) --> [].

regex_concat(R) --> regex_op(S), regex_concat1(S, R).

regex_concat1(R, T) --> regex_op(S), regex_concat1(regex_concat(R,S), T).
regex_concat1(R, R) --> [].

regex_op(regex_kleene(R)) --> regex_lit(R), [42].
regex_op(regex_concat(R,regex_kleene(R))) --> regex_lit(R), [43].
regex_op(regex_union(regex_empty,R)) --> regex_lit(R), [63].
regex_op(R) --> regex_lit(R).

regex_lit(regex_char([C])) --> [C], {\+ regex_ctrl(C)}.
regex_lit(regex_char([C])) --> [92], [C].

regex_lit(regex_char(CS)) --> [46], {findall(C, between(32,126, C), CS)}.

regex_lit(regex_char(DS)) --> 
    [91], [94], !, class_body(CS), [93],
    {findall(C, (between(32, 126, C), \+ member(C, CS)), DS)}.
regex_lit(regex_char(CS)) --> [91], class_body(CS), [93].

regex_lit(R) --> [40], regex_union(R), [41].

class_body([C|T]) --> class_lit(C),class_body(T).
class_body(CS) -->
    class_lit(C0), [45], class_lit(C1), class_body(T),
    {findall(C, between(C0, C1, C), H), append(H,T,CS)}.
class_body([]) --> [].

class_lit(C) --> [C], {\+ class_ctrl(C)}.
class_lit(C) --> [92], [C].

class_ctrl(C) :- string_codes("\\[]-", CS), member(C, CS).
regex_ctrl(C) :- string_codes("\\.[]|+?*()", CS), member(C, CS).

% Regex Engine
%%%%%%%%%%%%%% 

% The regex empty matches any string without consuming any characters.
match(S, regex_empty, S).

% A regex consisting of a single character matches any string starting with
% that character. The chanter is consumed.
match([C|S], regex_char(CS), S) :- member(C, CS).

% A union of two regex only needs to satisify one of the branches.
match(S, regex_union(L,R), T) :- match(S, L, T); match(S, R, T).     

% A concat of two regex must satisfy the left and then the right.
match(S, regex_concat(L, R), U) :- match(S, L, T), match(T, R, U).

% The kleene closure of a regex can match the regex 0 times or it can the regex
% once before matching the kleene closure again.
match(S, regex_kleene(_), S).
match(S, regex_kleene(K), U) :- match(S, K, T), S \= T, match(T, regex_kleene(K), U).

আমি প্রোলোগ ডিসিজি-র সাথে পরিচিত নই, এর সাথে কীভাবে regex_union(RE, RC, [])মিল মেলে regex_union(R) -->...?
ক্রিটিকি লিথোস

@ ক্রিটিক্সিলিথোস ডিসিজি এর পূর্বাভাসে দুটি জড়িত প্যারামিটার রয়েছে যা ডিসিজির কাছ থেকে বা এর অংশ হিসাবে ডেকে এলে স্বয়ংক্রিয়ভাবে সরবরাহ করা হয় phrase\2। প্রথমটি হ'ল ডিসিজি প্রয়োগ করা হয় স্ট্রিংটি এবং দ্বিতীয়টি স্ট্রিংটির প্রত্যয় যা ডিসিজি প্রিকেটকে সন্তুষ্ট করার পরে অবশেষ থাকে। একটি সমতুল্য নির্মাণ হবে phrase(regex_union(RE), RC)
ankh-morpork
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.