fundo
MQTT (Message Queuing Telemetry Transport) é um baseada-subscribe publicar protocolo de mensagens padrão ISO ( Wikipedia ).
Cada mensagem tem um tópico, como os seguintes exemplos:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Os clientes MQTT podem assinar tópicos de mensagens usando curingas:
- Nível único:
+
- Todos os níveis em diante:
#
Por exemplo, a assinatura myhome/groundfloor/+/temperature
produziria estes resultados (não conformidades em negrito ):
✅ myhome / térreo / sala / temperatura
✅ myhome / térreo / cozinha / temperatura
❌ myhome / térreo / sala / brilho
❌ myhome / firstfloor / sala / temperatura
❌ garagem / térreo / frigorífico / temperatura
Considerando que a assinatura +/groundfloor/#
produziria estes resultados:
✅ myhome / térreo / sala / temperatura
✅ myhome / térreo / cozinha / brilho
✅ garagem / térreo / geladeira / temperatura / mais / específico / campos
❌ myhome / primeiro andar / sala / temperatura /
❌ myhome / porão / canto / temperatura
Mais informações aqui .
A tarefa
Implemente uma função / programa aceitando duas strings e retornando um booleano. A primeira string é o tópico do assunto, a segunda é o tópico do critério. O tópico de critérios usa a sintaxe de assinatura detalhada acima. A função é verdadeira quando o assunto corresponde aos critérios.
Regras para esta tarefa:
- Os tópicos são ASCII
- Não há campos de critérios além do
#
curinga - Os curingas não aparecem nos tópicos do assunto
- Número de campos de assunto> = número de campos de critérios
- Não há campos com 0 caracteres nem barras iniciais ou finais
Casos de teste
critérios1 = "myhome / piso térreo / + / temperatura"
critérios2 = "+ / piso térreo / #"
("abc", "ab") => false
("abc", "abc") => true
("abc / de", "abc") => false
("myhome / groundfloor / livingroom / temperature", critérios1 ) => true
("myhome / piso térreo / cozinha / temperatura", critério1) => true
("myhome / piso térreo / sala de estar / brilho", critério1) => false
("myhome / piso térreo / sala de estar / temperatura", critério1) = > false
("garagem / piso térreo / geladeira / temperatura", critério1) => false
("casa / piso térreo / sala / temperatura", critério2) => true
("casa / piso térreo / cozinha / brilho", critério2) => true
("garagem / térreo / geladeira / temperatura / mais / específico / campos ", critérios2) => verdadeiro
(" myhome / primeiro andar / sala / temperatura ", critérios2) => falso
("myhome / porão / canto / temperatura", critérios2) => falso
("música / kei $ ha / mais recente", "+ / kei $ ha / +") => verdadeiro
fonte
a/b/c
não corresponderia aos critériosa/b
, por isso estou inclinado a dizer não .Respostas:
Gelatina , 20 bytes
Um link monádico que aceita uma lista de listas de caracteres
[topic, pattern]
, que retorna1
ou0
para correspondência ou não, respectivamente.Experimente online! Ou veja uma suíte de testes .
Como?
fonte
Ruby , 65 bytes
Solução Regex. Eu adicionei
Regex.escape
no caso de um nome de critério ser algo parecidocom.java/string[]/\n
ou bobo que teria partes de expressões regulares.Experimente online!
Solução não regex, 77 bytes
Utiliza uma boa e simples técnica de divisão, zip e correspondência. Eu desenvolvi esse primeiro antes de perceber que mesmo com
Regex.escape
a solução regex teria sido menor de qualquer maneira.Experimente online!
fonte
.*?
deve funcionar no lugar de[^/]*
.a/+/d
com temaa/b/c/d
Perl 5
-pl
, 50 bytesExperimente online!
fonte
<>=~/^$_$/
no finalPython 3 , 72 bytes
Experimente online!
Esse problema pode ser simplificado trivialmente para uma correspondência de regex, embora outro método mais interessante possa produzir melhores resultados.
Edição Eu vim com uma solução de 107 bytes que não usa regex. Eu não sei se ele pode ficar menor que 72 ou talvez eu simplesmente não esteja tentando corrigir a abordagem. Apenas a estrutura de zip dividido parece ser muito grande. Experimente Online!
fonte
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
que falha+/kei$ha/+
não correspondemusic/kei$ha/latest
.Python 2 ,
8584809289 bytesExperimente online!
Agradecemos a Jonathan Allan e a Value Ink por apontar bugs.
fonte
f('ab', 'abc')
.Haskell,
76737167 bytesExperimente online!
Edit: -4 bytes graças a @cole.
fonte
a#b=a==b
parece funcionar para alguns bytes menos, a menos que eu estou faltando alguma coisaClojure ,
107917665102 bytesUma função anônima, retorna o tópico do assunto
nil
como verdade e como falsey (válido em Clojure).107 102 trabalhando
91 76 65 todos derrotados com caracteres regex
fonte
music/kei$ha/latest
e critérios+/kei$ha/+
(que devem corresponder e é ASCII válido).Kotlin , 106 bytes
Experimente online!
fonte
Python 3,
9988 bytesSem usar uma regex. Com alguma ajuda de Jonathan Allan e Chas Brown.
fonte
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:])
salva 12. No entanto, este não consegue processar alguns casos extremos, comof('abc/ijk/x', 'abc/+/xyz')
ouf('abc/ijk/xyz', 'abc/+/x')
, o que pode ser corrigido comf=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')
ef('abc/de','abc')
(ambos devem retornarFalse
, mas há umIndexError
)....or p[:1]in(s[:1],'+')and...
corrige os casos de borda @ChasBrown e apontei para um custo de 2 bytes.f('a/b', 'a/+')
), mas corrigível em 0 bytes com...or(s[:1]in'/')*2:])
.Carvão , 36 bytes
Experimente online! Link é a versão detalhada do código. Saídas
-
(saída implícita do carvão vegetal paratrue
) para uma correspondência, nada para nenhuma correspondência. Explicação:Divida o assunto em
/
s.Divida os critérios em
/
s.Se o critério contiver (isto é, termina com) a
#
, remova-o e apare o assunto com o novo tamanho do critério.Onde os critérios contiverem
+
, substitua esse elemento no assunto por+
.Compare o assunto com os critérios e imprima implicitamente o resultado.
fonte
Retina 0.8.2 , 42 bytes
Experimente online! Explicação:
Sufixo a
/
às duas linhas.Remova repetidamente o primeiro elemento do assunto e dos critérios enquanto eles são iguais ou o elemento de critérios é um (feliz)
+
.O critério corresponde se for apenas um
#
(com o/
que foi adicionado anteriormente), caso contrário, o assunto e o critério devem estar vazios nesse ponto.fonte
Pitão , 22 bytes
Experimente online!
fonte
Geléia ,
2219 bytesExperimente online!
Um link monádico que assume como argumento
[topic], [criterion]
e retorna1
para uma correspondência e0
sem correspondência.fonte
JavaScript,
6966 bytesExperimente online!
fonte
music/kei$ha/latest
e nos critérios+/kei$ha/+
(que devem corresponder e é ASCII válido).Python 3 ,
149148 bytesExperimente online!
fonte
05AB1E , 21 bytes
Insira como uma lista na ordem
[criteria, topic]
.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte