tło
MQTT (Message Queuing Telemetry Transport) jest standardowym protokołem przesyłania wiadomości opartym na publikowaniu i subskrypcji ( Wikipedia ).
Każda wiadomość ma temat, na przykład następujące przykłady:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Klienci MQTT mogą subskrybować tematy wiadomości za pomocą symboli wieloznacznych:
- Pojedynczy poziom:
+
- Wszystkie poziomy dalej:
#
Na przykład subskrypcja myhome/groundfloor/+/temperature
przyniosłaby następujące wyniki (niezgodności pogrubione ):
✅ myhome / parter / salon / temperatura
✅ myhome / parter / kuchnia / temperatura
❌ myhome / parter / salon / jasność
❌ myhome / parter / salon / temperatura
❌ garaż / parter / lodówka / temperatura
Natomiast subskrypcja +/groundfloor/#
przyniosłaby następujące wyniki:
✅ mójhome / parter / salon / temperatura
✅ mójhome / parter / kuchnia / jasność
✅ garaż / parter / lodówka / temperatura / więcej / konkretne / pola
❌ mójhome / parter / salon / temperatura
❌ mójhome / piwnica / narożnik / temperatura
Więcej informacji tutaj .
Zadanie
Zaimplementuj funkcję / program akceptujący dwa ciągi znaków i zwracający wartość logiczną. Pierwszy ciąg to temat, drugi to temat. W temacie kryteriów używana jest składnia subskrypcji opisana powyżej. Funkcja jest prawdziwa, gdy badany spełnia kryteria.
Zasady tego zadania:
- Tematy są ASCII
- Nie ma pól kryteriów poza
#
symbolem wieloznacznym - Symbole wieloznaczne nie pojawiają się w tematach tematycznych
- Liczba pól tematycznych> = liczba pól kryteriów
- Nie ma pól 0-znakowych ani przednich lub ukośnych ukośników
Przypadki testowe
kryteria1 = „mójhome / parter / + / temperatura”
kryteria2 = „+ / parter / #”
(„abc”, „ab”) => false
(„abc”, „abc”) => true
(„abc / de”, „abc”) => false
(„mójhome / parter / salon / temperatura”, kryteria1 ) => true
(„mójhome / parter / kuchnia / temperatura”, kryteria 1) => true
(„mójhome / parter / salon / jasność”, kryteria 1) => false
(„mójhome / pierwsze piętro / salon / temperatura”, kryteria1) = > false
(„garaż / parter / lodówka / temperatura”, kryteria 1) => false
(„mójhome / parter / salon / temperatura”, kryteria2) => true
(„mójhome / parter / kuchnia / jasność”, kryteria2) => true
(„garaż / parter / lodówka / temperatura / więcej / specyficzne / pola ”, kryteria2) => prawda
(„ mójhome / pierwsze piętro / salon / temperatura ”, kryteria2) => fałsz
(„mójhome / piwnica / róg / temperatura”, kryteria2) => false
(„muzyka / kei $ ha / najnowsze”, „+ / kei $ ha / +”) => true
źródło
a/b/c
nie spełnia kryteriówa/b
, więc jestem skłonny powiedzieć Nie .Odpowiedzi:
Galaretka , 20 bajtów
Monadyczny link akceptujący listę list znaków
[topic, pattern]
, które zwraca odpowiednio1
lub0
dla dopasowania lub braku dopasowania.Wypróbuj online! Lub zobacz zestaw testowy .
W jaki sposób?
źródło
Rubinowy , 65 bajtów
Rozwiązanie Regex. Dodałem
Regex.escape
na wypadek, gdyby nazwa kryterium okazała się być czymś podobnymcom.java/string[]/\n
lub głupim, który zawierałby wyrażenia regularne.Wypróbuj online!
Rozwiązanie nieregexowe, 77 bajtów
Używa ładnej prostej techniki dzielenia, zamykania i dopasowywania. Opracowałem go najpierw, zanim zdałem sobie sprawę, że nawet przy
Regex.escape
użyciu wyrażenia regularnego i tak byłoby ono krótsze.Wypróbuj online!
źródło
.*?
powinien działać zamiast[^/]*
.a/+/d
z tematema/b/c/d
Perl 5
-pl
, 50 bajtówWypróbuj online!
źródło
<>=~/^$_$/
na koniecPython 3 , 72 bajty
Wypróbuj online!
Ten problem można w prosty sposób uprościć do dopasowania wyrażenia regularnego, chociaż inna bardziej interesująca metoda może dać lepsze wyniki.
EDYCJA Wymyśliłem 107-bajtowe rozwiązanie bez użycia wyrażenia regularnego. Nie wiem, czy może być krótszy niż 72, a może po prostu nie widzę poprawnego podejścia do tego. Jednak sama struktura podzielonego zamka wydaje się zbyt duża. Wypróbuj online!
źródło
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
co się nie udaje+/kei$ha/+
nie pasujemusic/kei$ha/latest
.Python 2 ,
8584809289 bajtówWypróbuj online!
Podziękowania dla Jonathana Allana i Value Ink za wskazanie błędów.
źródło
f('ab', 'abc')
.Haskell,
76737167 bajtówWypróbuj online!
Edycja: -4 bajty dzięki @cole.
źródło
a#b=a==b
wydaje się działać o kilka bajtów mniej, chyba że czegoś mi brakujeClojure ,
107917665102 bajtówAnonimowa funkcja zwraca temat jako prawdomówny i
nil
falsey (obowiązuje w Clojure).107 102 pracuje
91 76 65 wszystkich pokonanych z znakami regularnymi
źródło
music/kei$ha/latest
i kryteriów+/kei$ha/+
(które powinny pasować i są zgodne z ASCII).Kotlin , 106 bajtów
Wypróbuj online!
źródło
Python 3,
9988 bajtówBez użycia wyrażenia regularnego. Z pomocą Jonathana Allana i Chasa Browna.
źródło
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:])
oszczędza 12. Jednak to nie przetwarza niektórych przypadków krawędzi, takich jakf('abc/ijk/x', 'abc/+/xyz')
lubf('abc/ijk/xyz', 'abc/+/x')
, które można naprawić za pomocą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')
if('abc/de','abc')
(oba powinny wrócićFalse
, ale zamiast tego jestIndexError
)....or p[:1]in(s[:1],'+')and...
naprawia przypadki krawędzi @ChasBrown i wskazałem na koszt 2 bajtów.f('a/b', 'a/+')
), Ale można go naprawić za pomocą 0 bajtów...or(s[:1]in'/')*2:])
.Węgiel drzewny , 36 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjścia
-
(wynik domyślny dla Węglatrue
) dla dopasowania, nic dla braku dopasowania. Wyjaśnienie:Podziel temat na
/
s.Podziel kryteria na
/
s.Jeśli kryteria zawierają (tzn. Kończą się na)
#
a, usuń je i przytnij obiekt do nowej długości kryteriów.Jeżeli kryteria zawierają,
+
zamień ten element w temacie na+
.Porównaj temat z kryteriami i pośrednio wydrukuj wynik.
źródło
Retina 0.8.2 , 42 bajty
Wypróbuj online! Wyjaśnienie:
Przyrostek a
/
do obu linii.Wielokrotnie usuwaj pierwszy element zarówno podmiotu, jak i kryterium, gdy są one równe lub element kryteriów jest (szczęśliwy)
+
.Kryteria są zgodne, jeśli jest to tylko
#
(z/
dodanym wcześniej), w przeciwnym razie zarówno temat, jak i kryteria powinny być puste do tego momentu.źródło
Pyth , 22 bajty
Wypróbuj online!
źródło
Galaretka ,
2219 bajtówWypróbuj online!
Łącze monadyczne, które przyjmuje jako argument
[topic], [criterion]
i zwraca1
dopasowanie i0
brak dopasowania.źródło
JavaScript,
6966 bajtówWypróbuj online!
źródło
music/kei$ha/latest
i kryteriów+/kei$ha/+
(które powinny być zgodne i są zgodne z ASCII).Python 3 ,
149148 bajtówWypróbuj online!
źródło
05AB1E , 21 bajtów
Wprowadź jako listę w kolejności
[criteria, topic]
.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło