Hintergrund
MQTT (Message Queuing Telemetry Transport) ist ein ISO-Standard-Messaging-Protokoll auf Publish-Subscribe-Basis ( Wikipedia ).
Jede Nachricht hat ein Thema, z. B. die folgenden Beispiele:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
MQTT-Clients können Nachrichtenthemen mithilfe von Platzhaltern abonnieren:
- Einstufig:
+
- Alle Ebenen ab:
#
Das Abonnement myhome/groundfloor/+/temperature
würde beispielsweise folgende Ergebnisse liefern (Abweichungen in Fettdruck ):
✅ myhome / Erdgeschoss / Wohnzimmer / Temperatur
✅ myhome / Erdgeschoss / Küche / Temperatur
❌ myhome / Erdgeschoss / Wohnzimmer / Helligkeit
❌ myhome / erstes Stockwerk / Wohnzimmer / Temperatur
❌ Garage / Erdgeschoss / Kühlschrank / Temperatur
Während das Abonnement +/groundfloor/#
diese Ergebnisse hervorbringen würde:
✅ myhome / Erdgeschoss / Wohnzimmer / Temperatur
✅ myhome / Erdgeschoss / Küche / Helligkeit
✅ Garage / Erdgeschoss / Kühlschrank / Temperatur / mehr / spezifische / Felder
❌ myhome / Firstfloor / Wohnzimmer / Temperatur
❌ myhome / Keller / Ecke / Temperatur
Mehr Infos hier .
Die Aufgabe
Implementieren Sie eine Funktion / ein Programm, die / das zwei Zeichenfolgen akzeptiert und einen Booleschen Wert zurückgibt. Die erste Zeichenfolge ist das Thema, die zweite das Kriterienthema. Das Kriterienthema verwendet die oben beschriebene Abonnementsyntax. Die Funktion ist wahr, wenn das Thema den Kriterien entspricht.
Regeln für diese Aufgabe:
- Themen sind ASCII
- Es gibt keine Kriterienfelder außerhalb des
#
Platzhalters - Platzhalter werden in Themenbereichen nicht angezeigt
- Anzahl der Themenfelder> = Anzahl der Kriterienfelder
- Es gibt keine Felder mit 0 Zeichen und keine Schrägstriche
Testfälle
Kriterien1 = "myhome / Erdgeschoss / + / Temperatur"
Kriterien2 = "+ / Erdgeschoss / #"
("abc", "ab") => false
("abc", "abc") => true
("abc / de", "abc") => false
("myhome / Erdgeschoss / Wohnzimmer / Temperatur", Kriterien1 ) => wahr
("myhome / erdgeschoss / küche / temperatur", kriterien1) => wahr
("myhome / erdgeschoss / wohnzimmer / helligkeit", kriterien1) => falsch
("myhome / erster Stock / wohnzimmer / temperatur", kriterien1) = > false
("Garage / Erdgeschoss / Kühlschrank / Temperatur", Kriterien1) => false
("myhome / Erdgeschoss / Wohnzimmer / Temperatur", Kriterien2) => true
("myhome / Erdgeschoss / Küche / Helligkeit", Kriterien2) => true
("Garage / Erdgeschoss / Kühlschrank / Temperatur / mehr / spezifisch / Felder ", Kriterien2) => wahr
(" myhome / erster Stock / Wohnzimmer / Temperatur ", Kriterien2) => falsch
("myhome / Keller / Ecke / Temperatur", Kriterien2) => false
("Musik / Kei $ ha / Neueste", "+ / Kei $ ha / +") => true
quelle
a/b/c
würde nicht den Kriterien entsprechena/b
, daher neige ich dazu, Nein zu sagen .Antworten:
Gelee , 20 Bytes
Ein monadischer Link, der eine Liste von Zeichenlisten akzeptiert
[topic, pattern]
, die zurückgegeben werden1
oder0
für Übereinstimmung bzw. Nichtübereinstimmung.Probieren Sie es online aus! Oder sehen Sie sich eine Testsuite an .
Wie?
quelle
Ruby , 65 Bytes
Regex-Lösung. Ich fügte hinzu,
Regex.escape
falls ein Kriterienname zufällig so etwas wiecom.java/string[]/\n
oder etwas Dummes ist, das Regex-Stücke haben würde.Probieren Sie es online aus!
Nicht-Regex-Lösung, 77 Bytes
Verwendet eine schöne einfache Split-, Zip- und Match-Technik. Ich habe diese zuerst entwickelt, bevor mir klar wurde, dass selbst mit
Regex.escape
der Regex-Lösung sowieso kürzer gewesen wäre.Probieren Sie es online aus!
quelle
.*?
sollte anstelle von arbeiten[^/]*
.a/+/d
mit Thema auslösen wirda/b/c/d
Perl 5
-pl
, 50 BytesProbieren Sie es online aus!
quelle
<>=~/^$_$/
am EndePython 3 , 72 Bytes
Probieren Sie es online aus!
Dieses Problem kann trivial zu einer Regex-Übereinstimmung vereinfacht werden, obwohl eine andere interessantere Methode möglicherweise bessere Ergebnisse liefert.
BEARBEITEN Ich habe eine 107-Byte-Lösung ohne Regex entwickelt. Ich weiß nicht, ob es kürzer als 72 werden kann, oder vielleicht sehe ich einfach nicht, wie ich das richtig korrigieren soll. Nur die Split-Zip-Struktur scheint jedoch zu groß zu sein. Probieren Sie es online aus!
quelle
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
das scheitert+/kei$ha/+
stimmt nicht übereinmusic/kei$ha/latest
.Python 2 ,
8584809289 BytesProbieren Sie es online aus!
Vielen Dank an Jonathan Allan und Value Ink für den Hinweis auf Fehler.
quelle
f('ab', 'abc')
.Haskell,
76737167 BytesProbieren Sie es online aus!
Bearbeiten: -4 Bytes dank @cole.
quelle
a#b=a==b
scheint für ein paar Bytes weniger zu funktionieren, es sei denn, ich vermisse etwasClojure ,
107917665102 BytesEine anonyme Funktion gibt das Thema als wahr und
nil
als falsch zurück (gültig in Clojure).107 102 arbeiten
91 76 65 alle mit Regex-Zeichen besiegt
quelle
music/kei$ha/latest
und Kriterien fehl+/kei$ha/+
(die übereinstimmen sollten und ASCII gültig sind).Kotlin , 106 Bytes
Probieren Sie es online aus!
quelle
Python 3,
9988 BytesOhne Verwendung eines regulären Ausdrucks. Mit etwas Hilfe von Jonathan Allan und Chas Brown.
quelle
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:])
spart 12. Dies kann jedoch einige Randfälle wief('abc/ijk/x', 'abc/+/xyz')
oder nicht verarbeitenf('abc/ijk/xyz', 'abc/+/x')
, die mitf=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')
und fehlf('abc/de','abc')
(beide sollten zurückkehrenFalse
, aber stattdessen gibt es eineIndexError
)....or p[:1]in(s[:1],'+')and...
behebt die Randfälle @ChasBrown und ich wies auf Kosten von 2 Bytes hin.f('a/b', 'a/+')
), kann jedoch in 0 Bytes mit behoben werden...or(s[:1]in'/')*2:])
.Holzkohle , 36 Bytes
Probieren Sie es online aus! Der Link führt zur ausführlichen Version des Codes. Ausgaben
-
(die implizite Ausgabe von Charcoal fürtrue
) für eine Übereinstimmung, nichts für keine Übereinstimmung. Erläuterung:Teilen Sie das Thema auf
/
s.Teilen Sie die Kriterien auf
/
s.Wenn das Kriterium a enthält (dh mit a endet),
#
entfernen Sie es und schneiden Sie das Motiv auf die neue Länge des Kriteriums.Wenn das Kriterium enthält,
+
ersetzen Sie dieses Element im Betreff durch+
.Vergleichen Sie das Thema mit den Kriterien und drucken Sie das Ergebnis implizit aus.
quelle
Retina 0,8,2 , 42 Bytes
Probieren Sie es online aus! Erläuterung:
Suffix a
/
in beide Zeilen.Entfernen Sie wiederholt das erste Element sowohl des Betreffs als auch der Kriterien, während sie gleich sind oder das Kriterienelement a (glücklich) ist
+
.Die Kriterien stimmen überein, wenn es sich nur um ein
#
(mit dem/
zuvor hinzugefügten) handelt, andernfalls sollten sowohl das Thema als auch die Kriterien zu diesem Zeitpunkt leer sein.quelle
Pyth , 22 Bytes
Probieren Sie es online aus!
quelle
Gelee ,
2219 BytesProbieren Sie es online aus!
Ein monadischer Link, der als Argument dient
[topic], [criterion]
und1
für eine Übereinstimmung und0
für keine Übereinstimmung zurückkehrt.quelle
JavaScript,
6966 BytesProbieren Sie es online aus!
quelle
music/kei$ha/latest
und Kriterien fehl+/kei$ha/+
(die mit ASCII übereinstimmen sollten und gültig sind).Python 3 ,
149148 BytesProbieren Sie es online aus!
quelle
05AB1E , 21 Bytes
Eingabe als Liste in der Reihenfolge
[criteria, topic]
.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle