রেজেক্স: সমতাবাদী সিরিজের সাথে মেলে


18

ভূমিকা

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

চ্যালেঞ্জ

চ্যালেঞ্জটি হ'ল আমি "সমতাবাদী" সিরিজটি যে খুব স্বচ্ছন্দে ডাব করেছি তা মেলানো: বিভিন্ন চরিত্রের সমান সংখ্যার একটি সিরিজ। এটি উদাহরণ সহ সেরা বর্ণিত হয়েছে।

ম্যাচ:

aaabbbccc
xyz 
iillppddff
ggggggoooooollllllffffff
abc
banana

মেলে না:

aabc
xxxyyzzz
iilllpppddff
ggggggoooooollllllfff
aaaaaabbbccc
aaabbbc
abbaa
aabbbc

সাধারণকরণের জন্য, আমরা ফর্মের একটি বিষয় (যে কোনও অক্ষরের তালিকার জন্য , যেখানে সবার জন্য) মেলাতে চাইc1)n(c2)n(c3)n...(ck)nc1ckci != ci+1i, k > 1, and n > 0.

ব্যাখ্যা:

  • ইনপুট খালি হবে না।

  • একটি চরিত্র পরে স্ট্রিং এ নিজেকে পুনরাবৃত্তি করতে পারে (উদা। "কলা")

  • k > 1, সুতরাং স্ট্রিংয়ে সর্বদা কমপক্ষে 2 টি আলাদা অক্ষর থাকবে।

  • আপনি ধরে নিতে পারেন কেবলমাত্র ASCII অক্ষরগুলি ইনপুট হিসাবে পাস হবে এবং কোনও অক্ষর কোনও লাইন টার্মিনেটর হবে না।

বিধি

(দুর্দান্তভাবে বর্ণিত নিয়মের এই ব্লকটির জন্য মার্টিন ইন্ডারকে ধন্যবাদ)

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

আপনি এই চ্যালেঞ্জের আগে বিদ্যমান যে কোনও রেগেক্স স্বাদ ব্যবহার করতে পারেন তবে দয়া করে স্বাদটি নির্দিষ্ট করুন।

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

আপনি ধরে নিতে পারেন ইনপুটটি সর্বদা দুটি বা ততোধিক ASCII অক্ষরের একটি স্ট্রিং থাকবে যাতে কোনও লাইন-টার্মিনেটর থাকে না।

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

নির্ণায়ক

এটি হ'ল ওল 'ফ্যাশনের গল্ফ, তাই দক্ষতা ভুলে যান এবং নিজের রেজেক্সটিকে যতটা সম্ভব ছোট করার চেষ্টা করুন।

দয়া করে উল্লেখ করুন আপনি কোন রেজেক্স গন্ধটি ব্যবহার করেছেন এবং যদি সম্ভব হয় তবে ক্রিয়াতে আপনার অভিব্যক্তিটির একটি অনলাইন ডেমো দেখানো একটি লিঙ্ক অন্তর্ভুক্ত করুন।


এটি কি বিশেষত একটি রেজেক্স গল্ফ? আপনার সম্ভবত এটির জন্য নিয়মগুলিও স্পষ্ট করা উচিত। এই সাইটের বেশিরভাগ চ্যালেঞ্জ হ'ল বিবিধ প্রোগ্রামিং ভাষার গল্ফ।
LyricLy

@ লিরিকলাই পরামর্শের জন্য ধন্যবাদ! হ্যাঁ, আমি এটি নিখুঁতভাবে রেজিএক্স হতে চাই, অর্থাত্‍। জমা দেওয়ার পছন্দের একটি রেগেক্স গন্ধে একক নিয়মিত প্রকাশ। অন্তর্ভুক্ত করার বিষয়ে আমার মনে রাখা উচিত অন্য কোনও নিয়ম আছে?
জয়তেয়া

আমি "সমতাবাদী" এর সংজ্ঞাটি বুঝতে পারি না, যেমন bananaসমতাবাদী।
msh210

@ msh210 যখন আমি সিরিজটি বর্ণনা করার জন্য "সমতাবাদী" শব্দটি নিয়ে এসেছি, তখন আমি বিবেচনা করি নি যে সিরিজের পরে অক্ষরগুলি পুনরাবৃত্তি করার অনুমতি দেব (যেমন "কলা" বা "আবাববিসিসিএএ ইত্যাদি)" । আমি কেবল এই শব্দটির প্রতিনিধিত্ব করার জন্য একটি পদ চাইছিলাম যে প্রতিবারের অক্ষরগুলির প্রতিটি অংশ একই আকারের হয়। যেহেতু "কলা" এর কোনও পুনরাবৃত্তি অক্ষর নেই তাই এই সংজ্ঞাটি এটির জন্য সত্য।
জয়তে

উত্তর:


11

.NET গন্ধ, 48 বাইট

^(.)\1*((?<=(\5())*(.))(.)(?<-4>\6)*(?!\4|\6))+$

এটি অনলাইন চেষ্টা করুন! ( রেটিনা ব্যবহার করে )

ওয়েল, দেখা যাচ্ছে যে যুক্তি অবহেলা না করা সর্বোপরি সহজ। আমি এটি একটি পৃথক উত্তর করছি, কারণ দুটি পদ্ধতির সম্পূর্ণ ভিন্ন।

ব্যাখ্যা

^            # Anchor the match to the beginning of the string.
(.)\1*       # Match the first run of identical characters. In principle, 
             # it's possible that this matches only half, a quarter, an 
             # eighth etc of of the first run, but that won't affect the 
             # result of the match (in other words, if the match fails with 
             # matching this as the entire first run, then backtracking into
             # only matching half of it won't cause the rest of the regex to
             # match either).
(            # Match this part one or more times. Each instance matches one
             # run of identical letters.
  (?<=       #   We start with a lookbehind to record the length
             #   of the preceding run. Remember that the lookbehind
             #   should be read from the bottom up (and so should
             #   my comments).
    (\5())*  #     And then we match all of its adjacent copies, pushing an
             #     empty capture onto stack 4 each time. That means at the
             #     end of the lookbehind, we will have n-1 captures stack 4, 
             #     where n is the length of the preceding run. Due to the 
             #     atomic nature of lookbehinds, we don't have to worry 
             #     about backtracking matching less than n-1 copies here.
    (.)      #     We capture the character that makes up the preceding
             #     run in group 5.
  )
  (.)        #   Capture the character that makes up the next run in group 6.
  (?<-4>\6)* #   Match copies of that character while depleting stack 4.
             #   If the runs are the same length that means we need to be
             #   able to get to the end of the run at the same time we
             #   empty stack 4 completely.
  (?!\4|\6)  #   This lookahead ensures that. If stack 4 is not empty yet,
             #   \4 will match, because the captures are all empty, so the
             #   the backreference can't fail. If the stack is empty though,
             #   then the backreference will always fail. Similarly, if we
             #   are not at the end of the run yet, then \6 will match 
             #   another copy of the run. So we ensure that neither \4 nor
             #   \6 are possible at this position to assert that this run
             #   has the same length das the previous one.
)+
$            # Finally, we make sure that we can cover the entire string
             # by going through runs of identical lengths like this.

আমি ভালবাসি যে আপনি দুটি পদ্ধতির মধ্যে দেখেছি! আমি আরও ভেবেছিলাম যে নেতিবাচক দৃষ্টিভঙ্গি কম হওয়া উচিত যতক্ষণ না আমি এটির চেষ্টা না করে এবং এটি আরও অনেক বিশ্রী না পেয়েছি (যদিও এটি মনে হয় এটি সহজ হওয়া উচিত)। আমার পিসিআরইতে 48 বি, এবং পার্লে 49 বি সম্পূর্ণ ভিন্ন পদ্ধতি সহ এবং একই আকারের কাছাকাছি। নেট এ আপনার 3 য় পদ্ধতি সহ আমি বলব এটি বেশ শান্ত
রেগেক্স

@Jaytea আমি সেগুলি দেখতে পছন্দ করব। যদি কেউ এক সপ্তাহ বা তার বেশি কিছু নিয়ে আসে না, আমি আশা করি আপনি সেগুলি নিজে পোস্ট করবেন। :) এবং হ্যাঁ রাজি হয়ে গেছে, এটা খুব ভাল যে পদ্ধতির বাইট গণনায় এতটা কাছাকাছি।
মার্টিন ইন্ডার

আমি কেবল! এছাড়াও, পার্ল একের উপর গল্ফ হয়েছে 46 বি;)
জয়তেয়া

সুতরাং আমি অনুভব করেছি যে আপনি এখন এটি দেখতে চাইবেন! এখানে পিসিআরআই-তে 48 বি রয়েছে: ((^.|\2(?=.*\4\3)|\4(?!\3))(?=\2*+((.)\3?)))+\3$আমি এটি 45 বি তৈরির \3*জায়গায় পরীক্ষা করেছিলাম (?!\3)কিন্তু এটি "আবাববিসি" তে ব্যর্থ হয় :( পার্ল সংস্করণটি বোঝা সহজ, এবং এটি এখন 45 বি তে নেমে গেছে: ^((?=(.)\2*(.))(?=(\2(?4)?\3)(?!\3))\2+)+\3+$- কারণ আমি এটিকে পার্ল বলি যদিও বৈধ পিসিআরই বলে মনে হয় যে পিসিআরই মনে করে (\2(?4)?\3)অনির্দিষ্টকালের জন্য পুনরাবৃত্তি করতে পারে তবে পার্ল একটু স্মার্ট / ক্ষমাশীল!
জয়টা ২a

@ জেটিয়া আহ, এগুলি আসলে ঝরঝরে সমাধান। আপনার সত্যিকার অর্থে পৃথক উত্তরে পোস্ট করা উচিত। :)
মার্টিন এন্ডার

9

.NET গন্ধ, 54 বাইট

^(?!.*(?<=(\2)*(.))(?!\2)(?>(.)(?<-1>\3)*)(?(1)|\3)).+

এটি অনলাইন চেষ্টা করুন! ( রেটিনা ব্যবহার করে )

আমি বেশ নিশ্চিত যে এটি সাবঅপটিমাল, তবে এখনই গ্রুপগুলির ভারসাম্য বজায় রাখার পক্ষে এটিই সবচেয়ে ভাল। আমি একই বাইট গণনাতে একটি বিকল্প পেয়েছি, যা বেশিরভাগ ক্ষেত্রে একই রকম:

^(?!.*(?<=(\3())*(.))(?!\3)(?>(.)(?<-2>\4)*)(\2|\4)).+

ব্যাখ্যা

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

এখানে রেজেক্সের একটি ভাঙ্গন রয়েছে।

^(?!.*         # This negative lookahead means that we will match
               # all strings where the pattern inside the lookahead
               # would fail if it were used as a regex on its own.
               # Due to the .* that inner regex can match from any
               # position inside the string. The particular position
               # we're looking for is between two runs (and this
               # will be ensured later).

  (?<=         #   We start with a lookbehind to record the length
               #   of the preceding run. Remember that the lookbehind
               #   should be read from the bottom up (and so should
               #   my comments).
    (\2)*      #     And then we match all of its adjacent copies, capturing
               #     them separately in group 1. That means at the
               #     end of the lookbehind, we will have n-1 captures
               #     on stack 1, where n is the length of the preceding
               #     run. Due to the atomic nature of lookbehinds, we
               #     don't have to worry about backtracking matching
               #     less than n-1 copies here.
    (.)        #     We capture the character that makes up the preceding
               #     run in group 2.
  )
  (?!\2)       #   Make sure the next character isn't the same as the one
               #   we used for the preceding run. This ensures we're at a
               #   boundary between runs.
  (?>          #   Match the next stuff with an atomic group to avoid
               #   backtracking.
    (.)        #     Capture the character that makes up the next run
               #     in group 3.
    (?<-1>\3)* #     Match as many of these characters as possible while
               #     depleting the captures on stack 1.
  )
               #   Due to the atomic group, there are three two possible
               #   situations that cause the previous quantifier to stopp
               #   matching. 
               #   Either the run has ended, or stack 1 has been depleted.
               #   If both of those are true, the runs are the same length,
               #   and we don't actually want a match here. But if the runs
               #   are of different lengths than either the run ended but
               #   the stack isn't empty yet, or the stack was depleted but
               #   the run hasn't ended yet.
  (?(1)|\3)    #   This conditional matches these last two cases. If there's
               #   still a capture on stack 1, we don't match anything,
               #   because we know this run was shorter than the previous
               #   one. But if stack 1, we want to match another copy of 
               #   the character in this run to ensure that this run is 
               #   longer than the previous one.
)
.+             # Finally we just match the entire string to comply with the
               # challenge spec.

আমি এটা উপর ব্যর্থ করার চেষ্টা: banana, aba, bbbaaannnaaannnaaa, bbbaaannnaaannnaaaaaa, The Nineteenth Byte, 11, 110, ^(?!.*(?<=(\2)*(.))(?!\2)(?>(.)(?<-1>\3)*)(?(1)|\3)).+, bababa। আমিই ব্যর্থ হয়েছি। :( +1
এরিক দ্য আউটগল্ফার

1
সেই মুহুর্তে যখন আপনি আপনার ব্যাখ্যাটি শেষ করেন এবং তারপরে খুঁজে বের করতে পারেন যে সঠিক বিপরীত পদ্ধতির সাহায্যে আপনি 1 বাইট সংরক্ষণ করতে পারবেন ... আমি মনে করি আমি আরও একটি উত্তর দেবো ...: |
মার্টিন ইন্ডার

@ মার্টিনেন্ডার ... এবং তারপরে আপনি বুঝতে পারেন যে আপনি এটি 2 বাইট হা হা করে গল্ফ করতে পারেন: পি
মিঃ এক্সকোডার

@ মিঃ এক্সকোডার এখন 7 বাইট হতে হবে, তাই আমি আশা করি আমি নিরাপদ। ;)
মার্টিন ইন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.