একটি বাইনারি শব্দের সাথে মিলিয়ে সবচেয়ে সংক্ষিপ্ত সরল রেজেক্স


20

কার্য

কেবলমাত্র সমন্বিত একটি খালি খালি নিয়মিত এক্সপ্রেশন হিসাবে একটি সাধারণ রেজেক্সকে সংজ্ঞায়িত করুন

  • অক্ষর 0এবং 1,
  • গ্রুপিং বন্ধনী (এবং ),
  • এক বা একাধিক পুনরাবৃত্তি পরিমাণ +

0গুলি এবং গুলিগুলির একটি খালি খালি স্ট্রিং দেওয়া 1, আপনার প্রোগ্রামটি সম্পূর্ণ ইনপুট স্ট্রিংয়ের সাথে মিলিয়ে সংক্ষিপ্ততম সহজ রেজেক্সটি খুঁজে পাওয়া উচিত । (এটি, কোনও সরল রেজেক্সের সাথে মিলে যাওয়ার ভান করুন এটি দ্বারা ^ এবং  এটি $বুকেঁটেড)

, তাই সংক্ষিপ্ততম জমা (বাইটে) জিতেছে।

পরীক্ষার মামলা

1 -> 1
00 -> 00 or 0+
010 -> 010
1110 -> 1+0
01010 -> 01010
0101010 -> 0(10)+ or (01)+0
011111 -> 01+
10110110 -> (1+0)+
01100110 -> (0110)+ or (01+0)+
010010010 -> (010)+
111100111 -> 1+001+ or 1+0+1+
00000101010 -> 0+(10)+ or (0+1)+0
1010110001 -> 1(0+1+)+ or (1+0+)+1

3
আপনার স্পষ্ট করে দেওয়া উচিত যে আপনি আমাদের এমন একটি প্রোগ্রাম লিখতে চান যা রিজেক্স লিখবে, রেজেক্স আওয়ারসেলফ না লিখবে। তবে এটি আকর্ষণীয় দেখায়।
gcampbell

1
আমার পরীক্ষায়, 01100110এটি একটি আকর্ষণীয় ঘটনা ... একটি নির্লজ্জ আলগোরিদম লিখবে 01+0+1+0বা (0+1+)+0যা অনুকূল নয়।
নিল

উত্তর:


2

পাইথ, 20 বাইট

hf.x}z:zT1Zy*4"()01+

এটি চালাতে প্রায় 30 সেকেন্ড সময় নেয়, সুতরাং এটি অফলাইনে চালানো দরকার।

ব্যাখ্যা:

hf.x}z:zT1Zy*4"()01+
                        Implicit: z is the input string.
              "()01+    "()01+"
            *4          Repeated 4 times
           y            All subsequences in length order
hf                      Output the first one such that
      :zT1              Form all regex matches of z with the candidate string
    }z                  Check if the input is one of the strings
  .x      Z             Discard errors

আমি পুরোপুরি নিশ্চিত নই যে প্রতিটি সংক্ষিপ্ততম স্ট্রিংটি "() 01+" * 4 এর একটি অনুচ্ছেদ, তবে প্রয়োজনে কোনও বাইট ব্যয়ে 4 টি বাড়ানো যেতে পারে।


9

জাভাস্ক্রিপ্ট (ES6), 488 341 বাইট

s=>[s.replace(/(.)\1+/g,'$1+'),...[...Array(60)].map((_,i)=>`(${(i+4).toString(2).slice(1)})+`),...[...Array(1536)].map((_,i)=>`${i>>10?(i>>8&1)+(i&2?'+':''):''}(${i&1}${i&4?i>>4&1:i&16?'+':''}${i&8?''+(i>>7&1)+(i&64?i>>5&1:i&32?'+':''):''})+${i&512?(i>>8&1)+(i&2?'+':''):''}`)].filter(r=>s.match(`^${r}$`)).sort((a,b)=>a.length-b.length)[0]

ব্যাখ্যা: যেহেতু ছয়টি রেজেক্স সমস্ত সম্ভাব্য বাইনারি শব্দের প্রকাশ করতে পারে এবং দীর্ঘতম দুটিটি নয়টি বর্ণের দীর্ঘ, সেগুলি এবং সমস্ত ছোট রেজেক্সগুলি পরীক্ষা করার পক্ষে এটি যথেষ্ট। একজন প্রার্থী স্পষ্টতই "রান দৈর্ঘ্য এনকোডিং" (অর্থাত্ সমস্ত সংখ্যার রান যথাযথ +গুলি দ্বারা প্রতিস্থাপিত ) সহ স্ট্রিং, তবে একটি সেট এর স্ট্রিংগুলিও ()পরীক্ষা করা দরকার। আমি এই জাতীয় 1596 জন পুনরায় তৈরি করি (এর মধ্যে সদৃশ এবং অকেজো regexes অন্তর্ভুক্ত রয়েছে তবে সেগুলি কেবল সরিয়ে দেওয়া হবে) এবং সংক্ষিপ্ততম ম্যাচটি দেখতে 1597 সমস্ত পরীক্ষা করে test উত্পন্ন উত্সাহগুলি দুটি ধরণের মধ্যে পড়ে: \(\d{2,5}\)\+(re০ টি রেজেক্সস) এবং (\d\+?)?\(\d[\d+]?(\d[\d+]?)?\)(\d\+?)?(১৫3636 রেজিেক্সস হিসাবে আমি অগ্রণী এবং অনুমান উভয় সংখ্যার সাথে রেজিেক্সগুলি এড়াতে পারি)।


@ ল্যাকইনুন মূলত আমি ভেবেছিলাম 9 টি দৈর্ঘ্যের 4 রেজিক্স রয়েছে তবে এটি স্পষ্টতই ভুল তাই আমি আমার ব্যাখ্যাটি পরিষ্কার করে দিয়েছি।
নীল

2

পাইথ - 31 30 29 বাইট

পাশবিক বল! সম্ভবত পুনরুক্তিকারী কিছুটা গল্ফ করতে পারেন।

 f=+Yf.x:zjY"^$")Z^"10+()"T1Y

টেস্ট স্যুট


1

রুবি, 109 বাইট

এটি বিরক্তিকর নিষ্ঠুর শক্তি পদ্ধতির। কাজ করে কারণ কোনও রেজেক্সের 9 টি অক্ষরের বেশি হওয়া উচিত নয় (নীল নোট হিসাবে) এবং কোনও স্বতন্ত্র অক্ষর 4 বারের বেশি পুনরাবৃত্তি করার প্রয়োজন হয় না (এটি দিয়ে চেষ্টা করে)'01()+'.chars*9 আমার সিপিইউকে অসন্তুষ্ট করে তোলে)।

10.times{|i|('01()+'.chars*4).combination(i).map{|s|begin
/^#{s*''}$/=~$*[0]&&[puts(s*''),exit]
rescue
end}}
$ for word in `grep -Po '^\S+' test_cases.txt`; do nice -n20 ruby sre.rb $word; done
1
0+
010
1+0
01010
0(10)+
01+
(1+0)+
(01+0)+
(010)+
1+0+1+
0+(10)+
1(0+1+)+

1

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

ব্রুট-জোর করা ছাড়াও এই সমস্যার কোনও পন্থা রয়েছে কিনা তা আমি তদন্ত করছি, তবে আপাতত এখানে পাইথন ব্রুট-ফোর্স সমাধান দেওয়া হচ্ছে।

import re,itertools
def a(b):
 for z in range(10):
  for i in itertools.combinations("01()+"*4,z):
   j=''.join(i)
   try:
    if re.fullmatch(j,b)and len(j)<=len(b):return j
   except:1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.