রেজেক্স যা কেবল নিজের সাথে মেলে


338

রেগেক্সের সাথে জড়িত কিছু দুর্দান্ত শীতল চ্যালেঞ্জ রয়েছে ( স্ব-ম্যাচিং রেজেক্স , রেজেক্স বৈধকরণের রেজেক্স )

এটি অসম্ভব ভাল হতে পারে, তবে কি এমন একটি রেজেক্স রয়েছে যা কেবল নিজের সাথে মেলে?

দ্রষ্টব্য, ডিলিমিটারগুলি অবশ্যই অন্তর্ভুক্ত থাকতে হবে:

উদাহরণস্বরূপ /thing/অবশ্যই মেলে /thing/এবং নাও thing। আপনার অভিব্যক্তির পক্ষে সম্ভব হওয়া একমাত্র ম্যাচটি হ'ল প্রকাশটিই হবে। অনেক ভাষা নিয়মিত প্রকাশের জায়গায় স্ট্রিং প্রয়োগের অনুমতি দেয়। উদাহরণস্বরূপ Go এ

package main

import "fmt"
import "regexp"

func main() {

    var foo = regexp.MustCompile("bar")
    fmt.Println(foo.MatchString("foobar"))
}

তবে চ্যালেঞ্জের স্বার্থে, অভিব্যক্তিটি সীমিত করা যাক (সূচনা প্রতীক, অভিব্যক্তি, সমাপ্তি প্রতীক প্রাক্তন: /fancypantpattern/বা @[^2048]@), যদি আপনি আপনার সীমানা হিসাবে উদ্ধৃতি যুক্তি দিতে চান, তবে তা হয়ে উঠুন। আমি মনে করি এই সমস্যার আপাতদৃষ্টিতে অসুবিধা দিলে এটি কোনও তাত্ক্ষণিক প্রভাব ফেলবে না।

আপনাকে পাশাপাশি সহায়তা করতে:

দ্রুত হ্যাক আমি রুবুলার ডট কমের জন্য একসাথে রেখেছি (রুবি রেজেক্স সম্পাদনার জন্য একটি ওয়েবপেজ):

var test = document.getElementById("test")
,regex = document.getElementById("regex")
,delimiter="/"
,options = document.getElementById("options")
,delay = function(){test.value = delimiter + regex.value + delimiter + options.value}
,update = function(e){
    // without delay value = not updated value
    window.setTimeout(delay,0);
}
regex.onkeydown = update;
options.onkeydown = update;

যদিও এটি প্রযুক্তিগতভাবে 'কোড গল্ফ' তবে আমি খুব মুগ্ধ হব যদি কেউ উত্তর পেতে / প্রমাণ করতে পারে তবে এটি অসম্ভব।

লিঙ্কটি এখন ঠিক করা হয়েছে। সবার জন্য দুঃখিত

এখন পর্যন্ত উত্তর জিতেছে : 40 টি অক্ষর সহ জিমি 23013


3
স্পষ্টত যে কোনও নিয়মিত অভিব্যক্তি যা কেবলমাত্র আক্ষরিক অন্তর্ভুক্ত তা কাজ করবে: //, / এ /, / এক্সআইজেড / ইত্যাদি re
ব্রেডবক্স

9
আক্ষরিক কাজ করবে না কারণ আপনাকে ব্যাকস্ল্যাশগুলির সাথে ম্যাচ করতে হবে উদাহরণস্বরূপ / aaa
এএএ

2
@ ডায়ালানমাদিসিটি কি আমাদের কি //ডিলিমিটার ব্যবহার করতে হবে , বা আমরা অন্যান্য ডেলিফিটর বেছে নিতে পারি (পিসিআরই যে কোনও চরিত্রকে সমর্থন করে এবং বিশেষত আপনি ম্যাচিং করা প্রথম বন্ধনী / ব্রেস / বন্ধনীগুলি ডিলিমিটার হিসাবে ব্যবহার করতে পারেন)।
মার্টিন এন্ডার

3
আমি মনে করি এটি বেশ চমৎকার গাণিতিক / গণনার সমস্যা এবং এর প্রমাণটি সহজ হতে পারে না ... অনেকগুলি গুরুত্বপূর্ণ উপপাদ্য কেবল একটি সহজ প্রশ্ন হিসাবে শুরু করা শুরু হয়েছিল, তাই সম্ভবত 5 বছরে উইকিপিডিয়া নিবন্ধ থাকবে "মাদিসেটি সমস্যা";)
পাওয়ে টোকার্জ

3
হ্যাঁ অবশ্যই. কিছু ভাষায় (ভাবাতে গ্রেপ ভাবেন) ডিলিমিটারটি মূলত একটি খালি স্ট্রিং। সুতরাং ধরে নিলাম যে রেজিএক্সপেকে প্রথমে ডিলিমিটর প্রয়োজন। প্রকৃতপক্ষে, যেহেতু গ্রেগ রেজিপেক্সের প্রাথমিকতম বাস্তবায়নগুলির মধ্যে একটি হ'ল রেজিপ্স্পের ক্যানোনিকাল সংজ্ঞাটি ডিলিমিটারগুলি রাখে না। এই অনুমানের সবচেয়ে উদ্বেগ প্রকাশটি পিএইচপি, যার জন্য দুটি ডিলিমিটার প্রয়োজন: "/এবং/"
স্লিটবেটম্যান

উত্তর:


588

পিসিআরই গন্ধ, 261 289 210 184 127 109 71 53 51 44 40 বাইট

হ্যা এটা সম্ভব!

<^<()(?R){2}>\z|\1\Q^<()(?R){2}>\z|\1\Q>

এখানে চেষ্টা করুন। (তবে /Regex101-এ ডিলিমিটার হিসাবে দেখানো হয়েছে))

Regex101 পৃষ্ঠায় অপ্রয়োজনীয় সম্পাদনা (আপডেট) করা থেকে বিরত থাকুন। আপনার সম্পাদনার আসলে উন্নতি চেষ্টা বা এই Regex পরীক্ষা সঙ্গে যুক্ত নয়, তাহলে আপনি এটি কাঁটাচামচ বা থেকে নতুন তৈরী করতে পারে তাদের হোমপেজে

সংস্করণটি Regex101 (44 বাইট) -এ আরও সঠিকভাবে কাজ করে:

/^\/()(?R){2}\/\z|\1\Q^\/()(?R){2}\/\z|\1\Q/

এখানে চেষ্টা করুন।

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

ব্যাখ্যা:

  • \Q^\/()(?R){2}\/\z|\1\Qস্ট্রিং মেলে ^\/()(?R){2}\/\z|\1\Q। এটি এমন এক ছদ্মবেশ ব্যবহার \Q...\Eকরে যা বন্ধ করতে হবে না, এবং অনির্ধারিত ডিলিমিটররা এতে কাজ করে \Q। এটি কিছু পূর্ববর্তী সংস্করণগুলি কেবল স্থানীয়ভাবে নয় বরং রেজেক্স 101 এ কাজ করে। তবে ভাগ্যক্রমে সর্বশেষতম সংস্করণটি কাজ করেছে এবং আমি এটি ব্যবহার করে আরও কিছু বাইট গল্ফ করেছি।
  • \1\Qদখল করা গোষ্ঠীটির সাথে ম্যাচ হওয়ার আগে ১। যেহেতু এই বিকল্পটিতে গ্রুপ 1 বিদ্যমান নেই, এটি কেবল পুনরাবৃত্ত কলগুলিতে মিলতে পারে। পুনরাবৃত্ত কলগুলিতে এটি খালি স্ট্রিংগুলির সাথে মেলে।
  • (?R){2}পুরো রিজেক্সকে পুনরাবৃত্তভাবে দুবার কল করে, যা ^\/()(?R){2}\/\z|\1\Qপ্রতিটি সময়ের সাথে মেলে ।
  • () গোষ্ঠী 1 তে একটি খালি স্ট্রিং ক্যাপচার করা ছাড়া আর কিছুই করে না, যা পুনরাবৃত্তির কলগুলিতে অন্যান্য বিকল্পকে সক্ষম করে।
  • ^\/()(?R){2}\/\z(?R){2}শুরু থেকে শেষ পর্যন্ত ডিলিমিটারগুলির সাথে মিল রয়েছে। \/সামনে recursive কল এছাড়াও নিশ্চিত এই অপশনটি নিজেই recursive কল মধ্যে মিলছে না, কারণ এটি স্ট্রিং শুরুতে হবে না করেন।

বন্ধ সঙ্গে 51 বাইট \Q...\E:

/\QE\1|^\/(\\)Q(?R){2}z\/\E\1|^\/(\\)Q(?R){2}z\/\z/

এখানে চেষ্টা করুন।

আসল সংস্করণ, 188 বাইট

প্রায় 100 বাইট গল্ফ করার জন্য মার্টিন বাটনারকে ধন্যবাদ!

/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{11}$/

এখানে চেষ্টা করুন।

বা 210 বাইট ছাড়াই \Q...\E:

/^(?=.{194}\\2\\.\)\{2}\.\{12}\$\/D$)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{194}\2\\\2\\2\2\\\2\\\2\.\2\\\2\)\2\\\2\{2}\2\\\2\.\2\\\2\{12}\2\\\2\$\2\\\2\/D\2\$\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{12}$/D

এখানে চেষ্টা করুন।

প্রসারিত সংস্করণ:

/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)        # Match things near the end.
((?=(.2.|))                               # Capture an empty string or \2\ into group 2.
   \2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.
   \2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)      # 1st line escaped.
   \2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\) # 2nd line escaped.
){2}
.{11}$/x

মত এক্সটেনশানগুলি (?=এবং \1তথাকথিত "নিয়মিত" আর রেগুলার এক্সপ্রেশনের, যা quines সম্ভব করে তোলে করেছেন। ব্যাকরেফারেন্স নিয়মিত নয়, তবে লকহেড।

ব্যাখ্যা:

  • আমি বিশেষ চরিত্রগুলি এড়ানোর \2\জায়গায় ব্যবহার করি \। যদি \2খালি স্ট্রিংয়ের সাথে মেলে, \2\x(যেখানে xএকটি বিশেষ চরিত্রটি রয়েছে) xনিজেই মেলে । যদি \2ম্যাচ \2\, \2\xপলান এক সাথে মেলে। \2গ্রুপ ১ এর দুটি ম্যাচ রেজেজেসে আলাদা হতে পারে। প্রথমবারে \2খালি স্ট্রিংটি এবং দ্বিতীয়বারের সাথে মিলিয়ে নেওয়া উচিত \2\
  • \Q\2\)){2}.{11}$\E\/\z(লাইন 1) শেষ থেকে 15 টি অক্ষরের সাথে মেলে। এবং .{11}$(লাইন 7) শেষ থেকে 11 টি অক্ষরের সাথে মেলে (বা একটি ট্রেলিং নতুন লাইনের আগে)। সুতরাং দ্বিতীয় প্যাটার্নের ঠিক আগে প্যাটার্নটি অবশ্যই প্রথম প্যাটার্নে প্রথম 4 বা 3 অক্ষরের সাথে \2\.\2\|\2\)\2\)মেলে , সুতরাং অবশ্যই মেলতে হবে ...\2\)বা ...\2\। শেষের অক্ষরটি হওয়া উচিত কারণ সেখানে কোনও অনুবর্তনযোগ্য নিউলাইন থাকতে পারে না )। এবং মিলিত পাঠ্যটিতে )সঠিকতমটির আগে অন্যটি থাকে না , সুতরাং অন্য সমস্ত অক্ষর অবশ্যই এর মধ্যে থাকা উচিত \2\2হিসাবে সংজ্ঞায়িত করা হয় (.2.|), তাই এটি শুধুমাত্র হতে পারে \2\
  • প্রথম সারির পুরো অভিব্যক্তিটি হ'ল 188 টি অক্ষরের সাথে মেলে কারণ সমস্ত কিছুের নির্দিষ্ট দৈর্ঘ্য থাকে। গ্রুপ 1 এর দুটি সময় 45 * 2 টি অক্ষর এবং 29 বারের সাথে মেলে \2। এবং গ্রুপ 1 এর পরে জিনিসগুলি 11 টি অক্ষরের সাথে মেলে। সুতরাং দু'বারের মোট দৈর্ঘ্য \2অবশ্যই 3 টি অক্ষর হতে হবে। \2দ্বিতীয় বারের জন্য জানা 3 টি অক্ষর দীর্ঘ, এটি প্রথমবারের জন্য খালি থাকতে হবে।
  • দৃষ্টিকোণ ব্যতীত সবকিছুই \2এবং গ্রুপ 1 টিতে আক্ষরিক । দুটি সময় \2পরিচিত, এবং প্রথম লাইন থেকে জানা শেষ কয়েকটি অক্ষর সহ, এই রেজেক্সটি হুবহু একটি স্ট্রিংয়ের সাথে মেলে।
  • মার্টিন বাটনার লুক 2 হেড ব্যবহার করে গ্রুপ 2 ক্যাপচার এবং কুইন পার্ট দিয়ে ওভারল্যাপ করার ধারণাটি নিয়ে আসে। এটি গ্রুপ 1 এর দুটি সময়ের মধ্যে স্বাভাবিক উপায়ে পালিয়ে যাওয়া অক্ষরগুলিকে সরিয়ে দিয়েছে এবং আমার মূল সংস্করণে সেগুলি মেলে ধরতে প্যাটার্নটি এড়াতে সহায়তা করেছে এবং রেজেক্সকে অনেক সরল করে তুলেছে।

পুনরাবৃত্তি বা ব্যাকেরেফারেন্স ছাড়াই রেজেক্স, 85 বাইট

কেউ তর্ক করতে পারেন যে পুনরাবৃত্তি বা পশ্চাদগহনের সাথে প্রকাশগুলি সত্য "নিয়মিত" এক্সপ্রেশন নয়। তবে কেবলমাত্র চেহারাযুক্ত অভিব্যক্তিগুলি কেবলমাত্র নিয়মিত ভাষার সাথেই মিলতে পারে, যদিও traditionalতিহ্যবাহী নিয়মিত প্রকাশ দ্বারা প্রকাশ করা এগুলি আরও দীর্ঘতর হতে পারে।

/(?=.*(\QE\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\E\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\z/

এখানে চেষ্টা করুন।

\Q...\E(গল্ফ করা) ছাড়াই 610 বাইট :

/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D

এখানে চেষ্টা করুন।

ধারণাটিও একই রকম।

/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)
((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)
(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}
  (.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}
    (.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\
    (.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}
  (.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}
  (.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}
  (.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D

বেসিক নিয়মিত প্রকাশ

যদি সন্ধানের অনুমতি না দেওয়া হয় তবে আমি এখন সবচেয়ে ভাল করতে পারি:

/\\(\\\(\\\\){2}/

যা মেলে

\\(\\\(\\

যদি {m,n}কোয়ান্টেফায়ারকে অনুমতি না দেওয়া হয় তবে এটি অসম্ভব কারণ যা কেবলমাত্র একটি স্ট্রিংয়ের সাথে মেলে না এমন কোনও কিছুই নিজের থেকে দীর্ঘতর স্ট্রিংয়ের সাথে মেলে না। অবশ্যই কেউ এখনও এমন কিছু আবিষ্কার করতে পারে \qযা কেবল মেলে /\q/, এবং এখনও সেই নিয়মিত সাথে অভিব্যক্তি বলে। তবে দৃশ্যত এর মতো কিছুই বড় বাস্তবায়ন দ্বারা সমর্থিত নয়।


5
চিত্তাকর্ষক। আমি এটির সাথে অন্য কিছু মিলানোর চেষ্টা করার জন্য কিছুটা সময় ব্যয় করেছি, কোনও সাফল্য নেই।
primo

76
কীভাবে (নরক) এমন একটি মানুষ উত্পাদন করতে পারে?
xem

61
এটি এই সাইটে সর্বাধিক ভোট প্রাপ্ত উত্তর পাওয়ার যোগ্য।
ক্রંચার

44
এটি আমার মধ্যে দেখা সবচেয়ে অযৌক্তিক, অবিশ্বাস্য জিনিস।
অ্যালেক্স এ।

22
কেউ এই পোস্টটিতে টুইট করেছে যাতে আমি একদিনে 49 টি আপগেট পেয়েছি ...
জিমি 23013
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.