এমকিউটিটি সাবস্ক্রিপশন বিষয় ম্যাচ


10

পটভূমি

এমকিউটিটি (মেসেজ কুইউটিং টেলিমেট্রি ট্রান্সপোর্ট) একটি আইএসও স্ট্যান্ডার্ড প্রকাশনা-সাবস্ক্রাইব-ভিত্তিক মেসেজিং প্রোটোকল ( উইকিপিডিয়া )।

প্রতিটি বার্তায় একটি বিষয় রয়েছে যেমন নীচের উদাহরণগুলি:

  • myhome/groundfloor/livingroom/temperature
  • USA/California/San Francisco/Silicon Valley
  • 5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
  • Germany/Bavaria/car/2382340923453/latitude

এমকিউটিটি গ্রাহকরা ওয়াইল্ডকার্ড ব্যবহার করে বার্তার বিষয়গুলিতে সাবস্ক্রাইব করতে পারেন:

  • একক স্তর: +
  • সমস্ত স্তর পরবর্তী: #

উদাহরণস্বরূপ, সাবস্ক্রিপশনটি myhome/groundfloor/+/temperatureএই ফলাফলগুলি তৈরি করবে (সাহসীভাবে অসম্পূর্ণতা ):

✅ মাইহোম / গ্রাউন্ডফ্লোয়ার / লিভিংরুম / তাপমাত্রা
✅ মাইহোম / গ্রাউন্ডফ্লোর / রান্নাঘর / তাপমাত্রা
❌ মাইহোম / গ্রাউন্ডফ্লোর / লিভিংরুম / উজ্জ্বলতা
❌ মাইহোম / ফার্স্ট ফ্লোর / লিভিংরুম / তাপমাত্রা
গ্যারেজ / গ্রাউন্ডফ্লোয়ার / ফ্রিজ / তাপমাত্রা

যেখানে সাবস্ক্রিপশনটি +/groundfloor/#এই ফলাফলগুলি আনবে:

✅ মাইহোম / গ্রাউন্ডফ্লোয়ার / লিভিংরুম / তাপমাত্রা
✅ মাইহোম / গ্রাউন্ডফ্লোর / রান্নাঘর / উজ্জ্বলতা
✅ গ্যারেজ / গ্রাউন্ডফ্লোয়ার / ফ্রিজ / তাপমাত্রা / আরও / নির্দিষ্ট / ক্ষেত্রগুলি
❌ মাইহোম / ফার্স্ট ফ্লোর / লিভিংরুম / তাপমাত্রা
❌ মাইহোম / বেসমেন্ট / কোণ / তাপমাত্রা

আরও তথ্য এখানে

কাজটি

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

এই কাজের জন্য বিধি:

  • বিষয়গুলি ASCII
  • #ওয়াইল্ডকার্ডের বাইরে কোনও মানদণ্ড ক্ষেত্র নেই
  • ওয়াইল্ডকার্ডগুলি বিষয় প্রসঙ্গে উপস্থিত হয় না
  • বিষয় ক্ষেত্রের সংখ্যা> = মানদণ্ডের ক্ষেত্রগুলির সংখ্যা
  • 0 টি-অক্ষরের ক্ষেত্র নেই বা অগ্রণী স্ল্যাশগুলির শীর্ষস্থানীয় বা টেলিং নেই

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

মানদণ্ড 1 = "মাইহোম / গ্রাউন্ডফ্লুর / + / তাপমাত্রা"
মানদণ্ড 2 = "+ / গ্রাউন্ডফ্লোয়ার / #"

("abc", "ab") => মিথ্যা
("abc", "abc") => সত্য
("abc / de", "abc") => মিথ্যা
("মাইহোম / গ্রাউন্ডফ্লুর / লিভিংরুম / তাপমাত্রা", মানদণ্ড 1 ) => সত্য
("মাইহোম / গ্রাউন্ডফ্লুর / রান্নাঘর / তাপমাত্রা", মানদণ্ড 1) => সত্য
("মাইহোম / গ্রাউন্ড ফ্লোর / লিভিংরুম / উজ্জ্বলতা", মানদণ্ড 1) => মিথ্যা
("মাইহোম / ফার্স্ট ফ্লোর / লিভিংরুম / তাপমাত্রা", মানদণ্ড 1) = > মিথ্যা
("গ্যারেজ / গ্রাউন্ডফ্লুর / ফ্রিজ / তাপমাত্রা", মানদণ্ড 1) => মিথ্যা
("মাইহোম / গ্রাউন্ডফ্লুর / লিভিংরুম / তাপমাত্রা", মানদণ্ড 2) => সত্য
("মাইহোম / গ্রাউন্ডফ্লুর / রান্নাঘর / উজ্জ্বলতা", মানদণ্ড 2) => সত্য
( "গ্যারেজ / গ্রাউন্ডফ্লুর / ফ্রিজ / তাপমাত্রা / আরও / নির্দিষ্ট / ক্ষেত্রগুলি ", মানদণ্ড 2) => সত্য
(" মাইহোম / ফার্স্ট ফ্লোর / লিভিংরুম / তাপমাত্রা ", মানদণ্ড 2) => মিথ্যা
("মাইহোম / বেসমেন্ট / কোণার / তাপমাত্রা", মানদণ্ড 2) => মিথ্যা
("সংগীত / কেই $ হা / সর্বশেষ", "+ / কেই $ হা / +") => সত্য


@ হাইপারনিট্রিনো, এটি একটি ভাল প্রশ্ন। আমি বেড়ায় আছি বিষয় a/b/cমানদণ্ডের সাথে মেলে না a/b, তাই আমি না বলে ঝুঁকেছি
প্যাট্রিক

4
/, + এবং # গ্যারান্টিযুক্ত বিষয় অংশে প্রদর্শিত হবে না?
জোনাথন অ্যালান

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

1
থেকে @JonathanAllan docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/... : ওয়াইল্ডকার্ড অক্ষর টপিক ফিল্টার ব্যবহার করা যেতে পারে, কিন্তু না মধ্যে একটি বিষয় নাম ব্যবহার করা আবশ্যক
নিক কেনেডি

2
@ নিক কেনেডি - খুব ভাল খনন করা, তবে আমাদের সত্যিই দরকার নেই।
জোনাথন অ্যালান

উত্তর:


3

জেলি , 20 বাইট

ṣ€”/ZṖF”#eƊ¿œiÐḟ”+ZE

একটি মোনাডিক লিঙ্ক অক্ষরের তালিকার একটি তালিকা গ্রহণ করে [topic, pattern]যা যথাক্রমে ফিরে আসে 1বা 0ম্যাচ বা কোনও ম্যাচের জন্য নয়।

এটি অনলাইন চেষ্টা করুন! অথবা একটি পরীক্ষা-স্যুট দেখুন

কিভাবে?

ṣ€”/ZṖF”#eƊ¿œiÐḟ”+ZE - Link: list of lists of characters, [topic, pattern]
 €                   - for each:
ṣ                    -   split at occurrences of:
  ”/                 -     '/' character
    Z                - transpose (any excess of topic is kept)
           ¿         - while...
          Ɗ          - ...condition: last three links as a monad:
       ”#            -   '#' character
         e           -   exists in:
      F              -     flatten
     Ṗ               - ...do: pop the tail off
              Ðḟ     - filter discard those for which:
            œi       -   first multi-dimensional index of: ([] if not found, which is falsey)
                ”+   -     '+' character
                  Z  - transpose
                   E - all equal?

2

রুবি , 65 বাইট

রেজেক্স সমাধান। আমি যুক্ত করেছিলাম Regex.escapeযদি কোনও মানদণ্ডের নাম ঠিক com.java/string[]/\nতেমন ঘটে তবে এমন কিছু বা মূর্খ কিছু হতে পারে যা রেজেক্স টুকরো করে।

->s,c{s=~/^#{Regexp.escape(c).sub('\#','.*').gsub'\+','[^/]*'}$/}

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

নন-রেজেক্স সলিউশন, 77 বাইট

একটি দুর্দান্ত সরল বিভাজন, জিপ এবং ম্যাচের কৌশল ব্যবহার করে। আমি এটি বুঝতে পেরে প্রথমে এটি বিকাশ করেছি যে এমনকি Regex.escapeরেইগেক্স সমাধান সহ যাইহোক ছোট হয়ে যেত।

->s,c{s.split(?/).zip(c.split ?/).all?{|i,j|i==j||'+#'[j||9]||!j&&c[-1]==?#}}

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


.*?জায়গায় কাজ করা উচিত [^/]*
মনিকা এর মামলা মামলা

@ নিক হার্টলি যা a/+/dবিষয়ের সাথে মানদণ্ডের জন্য একটি মিথ্যা ম্যাচকে ট্রিগার করবেa/b/c/d
মান কালি

আহ, তাই হবে। একটি পরমাণু গোষ্ঠীতে মোড়ানো এটি স্থির করে, তবে তারপরে এটি দুটি বাইট দীর্ঘ হয়। আচ্ছা ভালো.
ফান্ড মনিকার লসুইট


1

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

lambda a,b:bool(re.match(b.translate({43:"[^/]+",35:".+"}),a))
import re

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

এই সমস্যাটি তুচ্ছভাবে একটি রেইজেক্স ম্যাচে সরল করা যায়, যদিও আরও একটি আকর্ষণীয় পদ্ধতি আরও ভাল ফলাফল আনতে পারে।

সম্পাদনা করুন আমি একটি 107-বাইট সমাধান রিজেক্স ব্যবহার না করে নিয়ে এসেছি। আমি জানি না এটি 72 এর চেয়ে কম হয়ে যেতে পারে বা আমি সম্ভবত এটির কাছে দৃষ্টিভঙ্গি সংশোধন করতে দেখছি না। যদিও স্প্লিট-জিপ কাঠামোটি অনেক বড় বলে মনে হচ্ছে। এটি অনলাইন চেষ্টা করুন!


2
যদি ক্রমটিতে অন্য কোনও রেজেক্স অক্ষর থাকে তবে এটি ব্যর্থ হতে পারে। আমি এটির জন্য সন্ধান করছিলাম যদিও বর্তমান পরীক্ষার কোনও ক্ষেত্রেই রিমোটিকভাবে রিজেক্স-জাতীয় কিছু নেই।
মান কালি

... f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')যার মতো ব্যর্থ হয়
জোনাথন অ্যালান

মান কালি যেমন বলে, +/kei$ha/+মেলে না music/kei$ha/latest
চ্যাস ব্রাউন

1

পাইথন 2 , 85 84 80 92 89 বাইট

lambda s,c:all(x in('+','#',y)for x,y in zip(c.split('/')+[0]*-c.find('#'),s.split('/')))

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

ধন্যবাদ জনাথন অ্যালান এবং মূল্য কালি বাগ ইশারা জন্য।


ভুল উত্তর দেয় f('ab', 'abc')
মূল্য কালি

@ জোনাথন অ্যালান: আসলে, বিধিগুলি বলে 'বিষয় ক্ষেত্রের সংখ্যা> = মানদণ্ড ক্ষেত্রের সংখ্যা' say তবে অন্যান্য সমস্যার সমাধানের প্রয়োজন ...
চ্যাস ব্রাউন

ওহ অদ্ভুত নিয়ম দেওয়া সমস্যার প্রসঙ্গ!
জোনাথন অ্যালান

1

হাস্কেল, 76 73 71 67 বাইট

(a:b)#(c:d)=a=='+'&&b#snd(span(/='/')d)||a=='#'||a==c&&b#d
a#b=a==b

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

সম্পাদনা: -4 বাইট @ কোলকে ধন্যবাদ


1
a#b=a==bকিছুটা বাইট কম কাজ করার জন্য মনে হচ্ছে, যদি আমি কিছু মিস করি না
কোলে

@ কোল: হ্যাঁ, কাজ করে। অনেক ধন্যবাদ!
নিমি

1

ক্লোজার , 107 91 76 65 102 বাইট

একটি বেনামে ফাংশন, সত্যের বিষয়টিকে মিথ্যা nilহিসাবে এবং ক্লোজারে বৈধ হিসাবে ফেরত দেয়।

(defn ?[t c](every? #(#{"#""+"(% 0)}(% 1))(apply #(map vector % %2)(map #(re-seq #"[^/]+" %) [t c]))))

107 102 কাজ
91 76 65 সব Regex অক্ষর সঙ্গে পরাজিত


... এবং আপনার প্রশ্নের অধীনে আমার মন্তব্য প্রাসঙ্গিক হয়ে যায়
জোনাথন অ্যালান

@ জোনাথন অ্যালান, প্রকৃতপক্ষে, + এবং # ব্যতীত বিষয় সম্পর্কিত স্ট্রিংগুলিতে উপস্থিত হবে না :)
প্যাট্রিক

আমি মনে করি এটি বিষয় music/kei$ha/latestএবং মানদণ্ডের জন্য ব্যর্থ হয়েছে +/kei$ha/+(যা মিলবে এবং বৈধ এএসসিআইআই হওয়া উচিত)।
চ্যাস ব্রাউন

@ চ্যাসব্রাউন, সঠিক এবং ^ এর পরিবর্তে with সহ; ধন্যবাদ।
প্যাট্রিক

1
প্রতিস্থাপনের আগে - প্রথমে '\ কিউ' এবং '\ ই' দিয়ে চেষ্টা করুন - উত্স
জোনাথন অ্যালান


0

পাইথন 3, 99 88 বাইট

একটি রেজেক্স ব্যবহার না করে। জোনাথন অ্যালান এবং চ্যাস ব্রাউন এর কিছু সহায়তায়।

f=lambda s,p:p in(s,'#')or p[:1]in(s[:1],'+')and f(s[1:],p['+'!=p[:1]or(s[:1]in'/')*2:])

f=lambda s,p:s==p or'#'==p[0]or p[0]in(s[0]+'+')and f(s[1:],p['+'!=p[0]or(s[0]=='/')*2:])সংরক্ষণ করুন ১২. তবে এটি কিছু প্রান্তের মামলাগুলি যেমন প্রক্রিয়া করতে ব্যর্থ হয় f('abc/ijk/x', 'abc/+/xyz')বা এর f('abc/ijk/xyz', 'abc/+/x')সাথে ঠিক করা যায়f=lambda s,p:s==p or'#'==p[:1]or p[:1]in(s[:1]+'+')and f(s[1:],p['+'!=p[:1]or(s[:1]=='/')*2:])
জোনাথন অ্যালান

এটির জন্য ব্যর্থ হয় f('abc','ab')এবং f('abc/de','abc')(উভয়েরই ফিরে আসা উচিত False, তবে পরিবর্তে এটি রয়েছে IndexError)।
চ্যাস ব্রাউন

...or p[:1]in(s[:1],'+')and...@ চাসব্রাউন প্রান্তের কেসগুলি ঠিক করে এবং আমি 2 বাইট ব্যয়ের জন্য নির্দেশ করেছিলাম।
জোনাথন অ্যালান

পিছনে '+' (যেমন f('a/b', 'a/+')) এর অন্য প্রান্তের ক্ষেত্রে ব্যর্থ হয় তবে 0 বাইটের সাথে স্থিরযোগ্য ...or(s[:1]in'/')*2:])
জোনাথন অ্যালান


0

কাঠকয়লা , 36 বাইট

≔⪪S/θ≔⪪S/ηF∧№η#⊟η≔…θLηθF⌕Aη+§≔θι+⁼θη

এটি অনলাইন চেষ্টা করুন! লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। কোনও ম্যাচের জন্য আউটপুটস -(চারকোলের অন্তর্নিহিত আউটপুট true), কোনও মিল নেই nothing ব্যাখ্যা:

≔⪪S/θ

বিষয়টি /এস তে বিভক্ত করুন ।

≔⪪S/η

/এস উপর মানদণ্ড বিভক্ত ।

F∧№η#⊟η≔…θLηθ

মানদণ্ডে যদি একটি থাকে (অর্থাত্ শেষ হয়) #তবে এটিকে সরিয়ে ফেলুন এবং মাপদণ্ডের নতুন দৈর্ঘ্যের বিষয়টিকে ছাঁটাই করুন।

F⌕Aη+§≔θι+

যেখানে মাপদণ্ড থাকে +তারপরে বিষয়টিতে সেই উপাদানটি প্রতিস্থাপন করে +

⁼θη

বিষয়টিকে মানদণ্ডের সাথে তুলনা করুন এবং সুস্পষ্টভাবে ফলাফল মুদ্রণ করুন।


0

রেটিনা 0.8.2 , 42 বাইট

%`$
/
+`^([^/]+/)(.*¶)(\1|\+/)
$2
^¶$|¶#/$

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

%`$
/

/উভয় লাইনে একটি প্রত্যয়

+`^([^/]+/)(.*¶)(\1|\+/)
$2

বিষয় এবং মানদণ্ড উভয়েরই প্রথম উপাদানটিকে বারবার সরান যখন তারা সমান হয় বা মানদণ্ডের উপাদানটি হ'ল (খুশি) +

^¶$|¶#/$

মানদণ্ডটি মেলে যদি এটি কেবল একটি #( এটি /আগে যুক্ত করা হয়েছিল) অন্যথায় বিষয় এবং মানদণ্ড উভয়ই এই বিন্দুতে খালি থাকা উচিত।






0

05 এ বি 1 ই , 21 বাইট

ε'/¡}ζʒ'+å≠}˜'#¡н2ôøË

ক্রমে একটি তালিকা হিসাবে ইনপুট [criteria, topic]

এটি অনলাইনে চেষ্টা করুন বা সমস্ত পরীক্ষার কেস যাচাই করুন

ব্যাখ্যা:

ε                      # Map both strings in the implicit input-list to:
 '/¡                  '#  Split the string on "/"
                       #   i.e. ["+/+/A/B/#","z/y/A/B/x/w/v/u"]
                       #    → [["+","+","A","B","#"],["z","y","A","B","x","w","v","u"]]
                     # After the map: zip/transpose the two string-lists,
                       # with space as (default) filler
                       #  → [["+","z"],["+","y"],["A","A"],["B","B"],["#","x"],[" ","w"],
                       #     [" ","v"],[" ","u"]]
      ʒ    }           # Filter each pair by:
       '+å≠           '#  Only keep those which do NOT contain a "+"
                       #   → [["A","A"],["B","B"],["#","x"],[" ","w"],[" ","v"],[" ","u"]]
            ˜          # Flatten the filtered list
                       #  → ["A","A","B","B","#","x"," ","w"," ","v"," ","u"]
             '#¡      '# Split the list by "#"
                       #  → [["A","A","B","B"],["x"," ","w"," ","v"," ","u"]]
                н      # Only keep the first part
                       #  → ["A","A","B","B"]
                 2ô    # Split this back into pairs of two
                       #  → [["A","A"],["B","B"]]
                   ø   # Zip/transpose them back
                       #  → [["A","B"],["A","B"]]
                    Ë  # And check if both inner lists are equal
                       #  → 1 (truthy)
                       # (after which the result is output implicitly)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.