Antecedentes
MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería basado en publicación, suscripción y estándar ISO ( Wikipedia ).
Cada mensaje tiene un tema, como los siguientes ejemplos:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Los clientes MQTT pueden suscribirse a los temas de mensajes utilizando comodines:
- Nivel único:
+
- Todos los niveles en adelante:
#
Por ejemplo, la suscripción myhome/groundfloor/+/temperature
produciría estos resultados (no conformidades en negrita ):
✅ myhome / planta baja / sala de estar / temperatura
✅ myhome / planta baja / cocina / temperatura
❌ myhome / planta baja / sala de estar / brillo
❌ myhome / primer piso / sala de estar / temperatura
❌ garaje / planta baja / refrigerador / temperatura
Mientras que la suscripción +/groundfloor/#
produciría estos resultados:
✅ myhome / planta baja / sala de estar / temperatura
✅ myhome / planta baja / cocina / brillo
✅ garaje / planta baja / refrigerador / temperatura / más / específico / campos
❌ myhome / primer piso / sala de estar / temperatura
❌ myhome / sótano / esquina / temperatura
Más información aquí .
La tarea
Implemente una función / programa que acepte dos cadenas y devuelva un valor booleano. La primera cadena es el tema del tema, la segunda es el tema del criterio. El tema de criterios utiliza la sintaxis de suscripción detallada anteriormente. La función es verdadera cuando el sujeto coincide con los criterios.
Reglas para esta tarea:
- Los temas son ASCII
- No hay campos de criterios más allá del
#
comodín - Los comodines no aparecen en los temas
- Número de campos de asunto> = número de campos de criterios
- No hay campos de 0 caracteres ni barras inclinadas hacia adelante o hacia atrás
Casos de prueba
criterios1 = "mi casa / planta baja / + / temperatura"
criterios2 = "+ / planta baja / #"
("abc", "ab") => falso
("abc", "abc") => verdadero
("abc / de", "abc") => falso
("mi casa / planta baja / sala de estar / temperatura", criterio1 ) => verdadero
("mi casa / planta baja / cocina / temperatura", criterio1) => verdadero
("mi casa / planta baja / sala de estar / brillo", criterio1) => falso
("mi casa / primer piso / sala de estar / temperatura", criterio1) = > falso
("garaje / planta baja / refrigerador / temperatura", criterio1) => falso
("mi casa / planta baja / sala de estar / temperatura", criterio2) => verdadero
("mi casa / planta baja / cocina / brillo", criterio2) => verdadero
("garaje / planta baja / refrigerador / temperatura / más / específico / campos ", criterio2) => verdadero
(" mi casa / primer piso / sala de estar / temperatura ", criterio2) => falso
("myhome / sótano / esquina / temperatura", criterio2) => falso
("music / kei $ ha / latest", "+ / kei $ ha / +") => true
fuente
a/b/c
no coincidía con los criteriosa/b
, por lo que me inclino a decir que no .Respuestas:
Jalea , 20 bytes
Un enlace monádico que acepta una lista de listas de caracteres
[topic, pattern]
, que devuelve1
o0
para coincidencia o no coincidencia respectivamente.Pruébalo en línea! O ver un conjunto de pruebas .
¿Cómo?
fuente
Ruby , 65 bytes
Solución de expresiones regulares. Agregué
Regex.escape
en caso de que un nombre de criterio sea algo así comocom.java/string[]/\n
algo tonto que tendría piezas de expresiones regulares.Pruébalo en línea!
Solución no regex, 77 bytes
Utiliza una bonita técnica simple de división, compresión y combinación. Desarrollé este primero antes de darme cuenta de que incluso con
Regex.escape
la solución regex habría sido más corta de todos modos.Pruébalo en línea!
fuente
.*?
debería funcionar en lugar de[^/]*
.a/+/d
con el temaa/b/c/d
Perl 5
-pl
, 50 bytesPruébalo en línea!
fuente
<>=~/^$_$/
al finalPython 3 , 72 bytes
Pruébalo en línea!
Este problema puede simplificarse trivialmente a una coincidencia de expresiones regulares, aunque otro método más interesante puede producir mejores resultados.
EDITAR Se me ocurrió una solución de 107 bytes que no usa expresiones regulares. No sé si puede ser más corto que 72 o tal vez simplemente no estoy tratando de corregir el enfoque de esto. Sin embargo, solo la estructura de cremallera dividida parece ser demasiado grande. ¡Pruébelo en línea!
fuente
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
que falla+/kei$ha/+
no coincidemusic/kei$ha/latest
.Python 2 ,
8584809289 bytesPruébalo en línea!
Gracias a Jonathan Allan y Value Ink por señalar errores.
fuente
f('ab', 'abc')
.Haskell,
76737167 bytesPruébalo en línea!
Editar: -4 bytes gracias a @cole.
fuente
a#b=a==b
Parece que funciona para unos pocos bytes menos, a no ser que me falta algoClojure ,
107917665102 bytesUna función anónima, devuelve el tema del tema como verdadero y
nil
falso (válido en Clojure).107 102 trabajando
91 76 65 todos derrotados con caracteres regex
fuente
music/kei$ha/latest
y criterios+/kei$ha/+
(que deben coincidir y es ASCII válido).Kotlin , 106 bytes
Pruébalo en línea!
fuente
Python 3,
9988 bytesSin usar una expresión regular. Con ayuda de Jonathan Allan y Chas Brown.
fuente
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:])
ahorra 12. Sin embargo, esto no puede procesar algunos casos extremos comof('abc/ijk/x', 'abc/+/xyz')
of('abc/ijk/xyz', 'abc/+/x')
, que se pueden solucionar conf=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')
yf('abc/de','abc')
(ambos deberían regresarFalse
, pero en su lugar hay unIndexError
)....or p[:1]in(s[:1],'+')and...
corrige los casos extremos @ChasBrown y señalé por un costo de 2 bytes.f('a/b', 'a/+')
) pero reparable en 0 bytes con...or(s[:1]in'/')*2:])
.Carbón , 36 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Salidas
-
(salida implícita de carbón paratrue
) para una coincidencia, nada para ninguna coincidencia. Explicación:Dividir el tema en
/
s.Dividir los criterios en
/
s.Si el criterio contiene (es decir, termina con) a
#
, elimínelo y recorte el tema a la nueva longitud del criterio.Donde el criterio contiene
+
, reemplace ese elemento en el tema con+
.Compare el tema con los criterios e imprima implícitamente el resultado.
fuente
Retina 0.8.2 , 42 bytes
Pruébalo en línea! Explicación:
Sufijo a
/
a ambas líneas.Repetidamente elimine el primer elemento de sujeto y criterio mientras son iguales o el elemento de criterio es un (feliz)
+
.El criterio coincide si es solo un
#
(con el/
que se agregó anteriormente) de lo contrario, tanto el sujeto como los criterios deberían estar vacíos en este punto.fuente
Pyth , 22 bytes
Pruébalo en línea!
fuente
Jalea ,
2219 bytesPruébalo en línea!
Un enlace monádico que toma como argumento
[topic], [criterion]
y vuelve1
para una coincidencia y0
para ninguna coincidencia.fuente
JavaScript,
6966 bytesPruébalo en línea!
fuente
music/kei$ha/latest
y los criterios+/kei$ha/+
(que deben coincidir y es ASCII válido).Python 3 ,
149148 bytesPruébalo en línea!
fuente
05AB1E , 21 bytes
Ingrese como una lista en el orden
[criteria, topic]
.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente