রেগেক্সগুলি সংকলন করুন (প্রতিস্থাপক দ্বারা)


21

আপনার কাজটি হ'ল রেজেক্সগুলি সংকলন করা ... একটি রেজেক্সে প্রতিটি চরিত্রের জন্য একটি বিকল্প নির্দিষ্ট করে।

Regexes

রেজেক্সেসগুলি এগুলিকে সমর্থন করে

REGEX       = (LITERAL REGEX / GROUP REGEX / STAR REGEX / ALTERNATIVE)
LITERAL     = 1 / 0
GROUP       = '(' REGEX ')'
STAR        = (LITERAL / GROUP) '*'
ALTERNATIVE = '('REGEX ('|' REGEX)*')'

কেন কেবল 1 বা 0? এটি সরলকরণের জন্য। রেজেক্সের কেবলমাত্র নিম্নলিখিত অক্ষরগুলি থাকে:

*()|10

এটি নিম্নলিখিত হিসাবে ব্যাখ্যা করা হয়:

  1. * ক্লিন তারকা (বাম দল বা আক্ষরিক 0 বা আরও অনেকবার পুনরাবৃত্তি করুন)।
  2. | বিকল্প হ'ল (যদি বামে রেজেক্স বা ডান ম্যাচগুলির রেজেক্স হয় তবে ম্যাচ)।
  3. () গ্রুপিং হয়।
  4. 1 চরিত্রের সাথে মেলে 1।
  5. 0 চরিত্র 0 এর সাথে মেলে।

সংকলন কিভাবে?

আপনি ছয়টি কোড স্নিপেট নির্দিষ্ট করেছেন: প্রতিটি রেগেক্স অক্ষর প্রতিস্থাপন করতে একটি। উদাহরণস্বরূপ, যদি আপনার উত্তরটি হয়:

*: FSAGFSDVADFS
|: GSDGSAG
(: GSDG
): GDSIH
1: RGIHAIGH
0:GIHEBN

তারপরে আপনি প্রতিটি রেজেক্সকে তার সম্পর্কিত কোড স্নিপেটের সাথে প্রতিস্থাপন করুন, সুতরাং:

(0|11)*

রূপান্তরিত হয়:

GSDGGIHEBNGSDGSAGRGIHAIGHRGIHAIGHGDSIHFSAGFSDVADFS

ফলস্বরূপ প্রোগ্রামটি করার কথা কি?

আপনার প্রোগ্রামটি করবে:

  1. ইনপুট নিন।
  2. যদি রেজেক্স পুরো ইনপুটটির সাথে মেলে তবে একটি সত্যবাদী মান আউটপুট করুন।
  3. অন্য একটি মিথ্যা মান আউটপুট।

বাইরের 01ইনপুটটি সংজ্ঞায়িত আচরণ is ইনপুট খালি থাকতে পারে।

অতিরিক্ত বিধি

  1. প্রদত্ত রেজেক্স চরিত্রের জন্য, ফলস্বরূপ স্নিপেটটি সর্বদা একই হতে হবে।
  2. এরপরে আর কোনও উপসর্গ বা প্রত্যয় যোগ করা হয়নি।
  3. রেজেক্সটি নিরবধি হওয়ার গ্যারান্টিযুক্ত।

স্কোরিং

সবচেয়ে কম সংযুক্ত স্নিপেটটি বিজয়ী winner সুতরাং উদাহরণস্বরূপ স্কোরটি নিম্নরূপ গণনা করা হবে:

FSAGFSDVADFS+ GSDGSAG+ GSDG+ GDSIH+ RGIHAIGH+GIHEBN

12 + 7 + 4 + 5 + 8 + 6 = 42


প্রতিটি স্নিপেট কমপক্ষে 1 অক্ষর দীর্ঘ হতে হবে?
ট্রিকোপলাক্স

স্নিপেটের শূন্য দৈর্ঘ্য থাকতে পারে। সম্পাদনা ঠিক আছে।
আকাংকা

এই চ্যালেঞ্জের জন্য কী ভাষা রেজিএক্স বৈধ? : পি
লুভজো

আমি বিবেচনা করি RegEx এর RegEx বিল্ট-ইন রয়েছে। আমি এই কাজ করতে বাধ্য। আমি রেটিনা এবং রেজেক্সকে বাদ দিতে চাই, তবে মেগো অনুসারে এটি অনুমোদিত নয়। তবুও, আমি শামুক এবং বন্ধুদের সম্পর্কে জানি না।
আকাংকা

@ ক্রিশ্চিয়ান ইরওয়ান মজার বিষয়, আমি এখনও নিশ্চিত নই যে এটি রেটিনার ক্ষেত্রেও দ্রবণযোগ্য, এমনকি এটি এখনও প্রতিযোগিতামূলক থেকে দূরে থাকবে।
মার্টিন ইন্ডার

উত্তর:


7

শামুক , 48 বাইট

0 -> )0(\0!(l.)(~

1 -> )0(\1!(l.)(~

( -> )0({{(

) -> )0}}(~

| -> )0}|{(

* -> )0),(~

যদি কেবলমাত্র সম্পূর্ণ ইনপুটটির সাথে মিল না দিয়ে আমাদের যদি আংশিক মিলগুলি অনুসন্ধান করতে হয় তবে এটি খুব সহজ হবে। 0হয়ে যাবে \0, 1হয়ে উঠবে \1, *হয়ে উঠবে ,, এবং অন্যরা নিজেরাই মানচিত্র করবে। পরিবর্তে প্রচুর শেননিগান রয়েছে ম্যাচগুলি শুরু থেকে অন্য কোথাও শুরু হওয়া বা শেষের বাইরে অন্য কোথাও শেষ হতে প্রতিরোধ করতে। !(l.)ম্যাচের শুরুটি যদি ইনপুটটির শুরুতে না হয় তবে ব্যর্থ হবে এমন একটি প্রতিবেদন। ~ইনপুটটির বাইরের একটি কক্ষের সাথে মেলে, তাই এটি সমস্ত অক্ষরগুলিতে যুক্ত করা হয়েছে যা রেজেক্সের শেষে থাকতে দেয়। যদি অন্য কোনও রেজেক্স অক্ষর অনুসরণ করে থাকে তবে এটি একটি সংখ্যাসূচক পরিমাণ দ্বারা বাতিল করা হয়0যার জন্য এটি 0 বার মেলাতে হবে, এটি মূলত মন্তব্য করে। *( ,) ডামি আউট অফ-সীমা পরীক্ষা হওয়া সত্ত্বেও সঠিকভাবে কাজ করার অনুমতি দেওয়ার জন্য, ভাষার বন্ধনীগুলির মিলের নিয়মগুলি প্রচুর ব্যবহৃত হয়। ডকুমেন্টেশন থেকে:

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

কাদা হিসাবে পরিষ্কার, তাই না?


দীর্ঘশ্বাস, আমি ভুলে গেছি যে এমনকি রেগেক্সের বাইরের ভাষাও মিলছে। খুব ভাল কাজ, তবে দুঃখিত, কোনও
উঁচুতে

@ ক্রিশ্চিয়ান ইরওয়ান এই সাইটটিতে 2 ডি মেলানো ভাষা বিকাশের জন্য একটি সম্পূর্ণ চ্যালেঞ্জ রয়েছে, যার বেশিরভাগের 1 ডি ডিজেনারেট ব্যবহার রয়েছে। কোডগলফ.স্ট্যাকেক্সেঞ্জাওয়েজ
স্পার

7

সিজেম, 151 বাইট

{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM0sa`T
{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM1sa`T
M{{+:M];eas!}:T}|U):UM'[T
MN`T
U(:UM'JT
M\"S+ea`,m*\"T

লাইনগুলি অক্ষরের সাথে মিলিত হয় 01(|)*(সেই ক্রমে)। এটি অনলাইন চেষ্টা করুন!

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

টেস্ট রান

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

$ cat regex.cjam
l"01(|)*""

{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM0sa`T
{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM1sa`T
M{{+:M];eas!}:T}|U):UM'[T
MN`T
U(:UM'JT
M\"S+ea`,m*\"T

"N%ers~
$ cjam regex.cjam '' <<< '(|)'
1
$ cjam regex.cjam '0' <<< '(|)'
0
$ cjam regex.cjam '' <<< '0(|)'
0
$ cjam regex.cjam '0' <<< '0(|)'
1
$ cjam regex.cjam '' <<< '(0|11)*'
1
$ cjam regex.cjam '0' <<< '(0|11)*'
1
$ cjam regex.cjam '11' <<< '(0|11)*'
1
$ cjam regex.cjam '011011000' <<< '(0|11)*'
1
$ cjam regex.cjam '1010' <<< '(0|11)*'
0

দুর্ভাগ্যক্রমে, এটি বিশেষভাবে দ্রুত নয়। এটি ইনপুটটিতে 9 টির বেশি অক্ষর বা রেজেক্সের একক ক্লিন তারার চেয়ে বেশি হলে এটি চটপট হয়ে যাবে।

5 টি অতিরিক্ত বাইটের ব্যয়ে - মোট 156 বাইটের জন্য - আমরা সম্ভাব্য ইনপুটটির সাথে মেলে তুলতে এবং সেগুলি নকল করতে আরও ছোট স্ট্রিং তৈরি করতে পারি। কোডটি কীভাবে কাজ করে তা পরিবর্তন করে না; এটি কেবল এটি আরও দক্ষ করে তোলে।

$ cat regex-fast.cjam 
l"01(|)*""

{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM0sa`T
{]Na/Saf+{:m*:sSf-~}%}:J{+:MU{]W=~Jea&,}|}:TM1sa`T
M{{+:M];eas!}:T}|U):UM'[T
MN`T
U(:UM'JT
M\"S+eas,)m*:sSf-L|\"T

"N%ers~
$ cjam regex-fast.cjam '0101001010' <<< '(01|10)*'
0
$ cjam regex-fast.cjam '011001101001' <<< '(01|10)*'
1
$ cjam regex-fast.cjam '0' <<< '(0*1)*'
0
$ time cjam regex-fast.cjam '101001' <<< '(0*1)*'
1

আমি কীভাবে এই সংক্ষিপ্ত এবং / অথবা দ্রুততর করতে পারি তার এখনও আমার কিছু ধারণা আছে। আমি ফলাফলের সাথে সন্তুষ্ট হলে আমি একটি ব্যাখ্যা যুক্ত করব।
ডেনিস

আদর্শহীন হিসাবে `-escaping of the " মনে হয় একটি অতিমাত্রায় " be এটি *নির্বিশেষে, আমি এই প্রোগ্রামটি কোনও ইনপুট গ্রহণ করতে পারিনি, এমনকি সরলতম ক্ষেত্রে যেখানে রেজেক্স কেবলমাত্র একটি 0( অনলাইন অনুবাদকের পরীক্ষায় দেখুন ) অন্তর্ভুক্ত Am আমি এটা ভুল করছি?
matz

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