Contexte
MQTT (Message Queuing Telemetry Transport) est un protocole de messagerie basé sur la publication-abonnement ( Wikipedia ) standard ISO .
Chaque message a un sujet, comme les exemples suivants:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Les clients MQTT peuvent s'abonner aux rubriques de message à l'aide de caractères génériques:
- Niveau unique:
+
- Tous les niveaux à partir de:
#
Par exemple, l'abonnement myhome/groundfloor/+/temperature
produirait ces résultats (non-conformités en gras ):
✅ myhome / rez-de-chaussée / salon / température
✅ myhome / rez-de-chaussée / cuisine / température
❌ myhome / rez-de-chaussée / salon / luminosité
❌ myhome / rez -de- chaussée / salon / température
❌ garage / rez-de-chaussée / réfrigérateur / température
Alors que l'abonnement +/groundfloor/#
produirait ces résultats:
✅ myhome / rez-de-chaussée / salon / température
✅ myhome / rez-de-chaussée / cuisine / luminosité
✅ garage / rez-de-chaussée / réfrigérateur / température / plus / spécifique / champs
❌ myhome / premier étage / salon / température
❌ myhome / sous - sol / coin / température
Plus d'infos ici .
La tâche
Implémentez une fonction / un programme acceptant deux chaînes et renvoyant un booléen. La première chaîne est le sujet sujet, la seconde est le sujet critère. La rubrique Critères utilise la syntaxe d'abonnement détaillée ci-dessus. La fonction est vraie lorsque le sujet correspond aux critères.
Règles pour cette tâche:
- Les sujets sont ASCII
- Il n'y a pas de champs de critères au-delà du
#
caractère générique - Les caractères génériques n'apparaissent pas dans les sujets
- Nombre de champs thématiques> = nombre de champs critères
- Il n'y a aucun champ de 0 caractère ni barre oblique avant ou arrière
Cas de test
critères1 = "ma maison / rez-de-chaussée / + / température"
critères2 = "+ / rez-de-chaussée / #"
("abc", "ab") => false
("abc", "abc") => true
("abc / de", "abc") => false
("myhome / rez-de-chaussée / salon / température", critère1 ) => true
("myhome / rez-de-chaussée / cuisine / température", critères1) => true
("myhome / rez-de-chaussée / salon / luminosité", critères1) => false
("myhome / rez-de-chaussée / salon / température", critères1) = > false
("garage / rez-de-chaussée / réfrigérateur / température",
critère1 ) => faux ("myhome / rez-de-chaussée / salon / température",
critère2 ) => true ("myhome / rez-de-chaussée / cuisine / luminosité", critère2) => true
("garage / rez-de-chaussée / réfrigérateur / température / plus / spécifique / champs ",
critère2 ) => vrai (" ma maison / rez-de-chaussée / salon / température ", critère2) => faux
("ma maison / sous-sol / coin / température", critère2) => faux
("musique / kei $ ha / dernier", "+ / kei $ ha / +") => vrai
la source
a/b/c
ne correspondrait pas aux critèresa/b
, donc j'ai tendance à dire non .Réponses:
Gelée , 20 octets
Un lien monadique acceptant une liste de listes de caractères
[topic, pattern]
, qui renvoie respectivement1
ou0
pour match ou no-match.Essayez-le en ligne! Ou consultez une suite de tests .
Comment?
la source
Ruby , 65 octets
Solution Regex. J'ai ajouté
Regex.escape
au cas où un nom de critère secom.java/string[]/\n
trouverait être quelque chose comme ou quelque chose de stupide qui aurait des morceaux d'expression régulière.Essayez-le en ligne!
Solution non regex, 77 octets
Utilise une technique simple de split, zip et match. J'ai d'abord développé celui-ci avant de réaliser que même avec
Regex.escape
la solution regex, elle aurait été de toute façon plus courte.Essayez-le en ligne!
la source
.*?
devrait fonctionner à la place de[^/]*
.a/+/d
avec le sujeta/b/c/d
Perl 5
-pl
, 50 octetsEssayez-le en ligne!
la source
<>=~/^$_$/
à la finPython 3 , 72 octets
Essayez-le en ligne!
Ce problème peut être simplifié de manière triviale en une correspondance d'expression régulière, bien qu'une autre méthode plus intéressante puisse produire de meilleurs résultats.
EDIT J'ai trouvé une solution de 107 octets n'utilisant pas regex. Je ne sais pas si cela peut devenir plus court que 72 ou peut-être que je ne cherche tout simplement pas à corriger l'approche à ce sujet. Cependant, la structure à zip divisé semble trop grande. Essayez-le en ligne!
la source
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
ce qui échoue+/kei$ha/+
ne correspond pasmusic/kei$ha/latest
.Python 2 ,
8584809289 octetsEssayez-le en ligne!
Merci à Jonathan Allan et Value Ink d' avoir signalé des bugs.
la source
f('ab', 'abc')
.Haskell,
76737167 octetsEssayez-le en ligne!
Edit: -4 octets grâce à @cole.
la source
a#b=a==b
semble fonctionner pour quelques octets de moins, sauf si je manque quelque choseClojure ,
107917665102 octetsUne fonction anonyme, renvoie le sujet comme véridique et
nil
comme falsey (valable dans Clojure).107 102 fonctionnant
91 76 65 tous vaincus avec des caractères regex
la source
music/kei$ha/latest
et les critères+/kei$ha/+
(qui devraient correspondre et sont valides ASCII).Kotlin , 106 octets
Essayez-le en ligne!
la source
Python 3,
9988 octetsSans utiliser d'expression régulière. Avec l'aide de Jonathan Allan et Chas Brown.
la source
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:])
enregistre 12. Cependant, cela ne parvient pas à traiter certains cas marginaux commef('abc/ijk/x', 'abc/+/xyz')
ouf('abc/ijk/xyz', 'abc/+/x')
, qui peuvent être corrigés avecf=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')
etf('abc/de','abc')
(les deux devraient revenirFalse
, mais à la place il y a unIndexError
)....or p[:1]in(s[:1],'+')and...
corrige les cas marginaux @ChasBrown et je l'ai souligné pour un coût de 2 octets.f('a/b', 'a/+')
) mais réparable en 0 octet avec...or(s[:1]in'/')*2:])
.Fusain , 36 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Sorties
-
(sortie implicite de Charcoal pourtrue
) pour une correspondance, rien pour aucune correspondance. Explication:Séparez le sujet à l'
/
art.Divisez les critères relatifs à l'
/
art.Si le critère contient (c'est-à-dire se termine par) a,
#
supprimez-le et ajustez le sujet à la nouvelle longueur des critères.Lorsque le critère contient,
+
remplacez cet élément du sujet par+
.Comparez le sujet avec les critères et imprimez implicitement le résultat.
la source
Retina 0.8.2 , 42 octets
Essayez-le en ligne! Explication:
Suffixe a
/
aux deux lignes.Supprimez à plusieurs reprises le premier élément du sujet et des critères pendant qu'ils sont égaux ou que l'élément de critère est (heureux)
+
.Les critères correspondent si c'est juste un
#
(avec celui/
qui a été ajouté plus tôt) sinon le sujet et les critères doivent être vides à ce stade.la source
Pyth , 22 octets
Essayez-le en ligne!
la source
Gelée ,
2219 octetsEssayez-le en ligne!
Un lien monadique qui prend comme argument
[topic], [criterion]
et renvoie1
pour une correspondance et0
pour aucune correspondance.la source
JavaScript,
6966 octetsEssayez-le en ligne!
la source
music/kei$ha/latest
et les critères+/kei$ha/+
(qui doivent correspondre et sont des ASCII valides).Python 3 ,
149148 octetsEssayez-le en ligne!
la source
05AB1E , 21 octets
Saisie sous forme de liste dans l'ordre
[criteria, topic]
.Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source