Фон
MQTT (Телеметрический транспорт сообщений) является стандартным протоколом обмена сообщениями на основе публикации и подписки ( Википедия ).
Каждое сообщение имеет тему, например следующие примеры:
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
Клиенты MQTT могут подписываться на темы сообщений, используя подстановочные знаки:
- Единый уровень:
+
- Все уровни вперед:
#
Например, подписка myhome/groundfloor/+/temperature
выдаст следующие результаты (несоответствия, выделенные жирным шрифтом ):
✅ мой дом / первый этаж / гостиная / температура
✅ мой дом / первый этаж / кухня / температура
❌ мой дом / первый этаж / гостиная / яркость
❌ мой дом / первый этаж / гостиная / температура
❌ гараж / первый этаж / холодильник / температура
Принимая во внимание, что подписка +/groundfloor/#
дала бы эти результаты:
✅ мой дом / первый этаж / гостиная / температура
✅ мой дом / первый этаж / кухня / яркость
✅ гараж / первый этаж / холодильник / температура / более / специфический / поля
❌ мой дом / первый этаж / гостиная / температура
❌ мой дом / подвал / угол / температура
Больше информации здесь .
Задание
Реализуйте функцию / программу, принимающую две строки и возвращающую логическое значение. Первая строка - тема темы, вторая - тема критерия. В разделе критериев используется синтаксис подписки, описанный выше. Функция правдива, когда субъект соответствует критериям.
Правила для этой задачи:
- Темы ASCII
- Поля критериев, кроме
#
подстановочных знаков, отсутствуют - Подстановочные знаки не отображаются в темах
- Количество тематических полей> = количество полей критериев
- Здесь нет 0-символьных полей, ни начальных, ни хвостовых косых черт
Контрольные примеры
критерии1 = "мой дом / земляной пол / + / температура"
критерии2 = "+ / земляной пол / #"
("abc", "ab") => false
("abc", "abc") => true
("abc / de", "abc") => false
("мой дом / первый этаж / гостиная / температура", критерии1 ) => true
(«мой дом / первый этаж / кухня / температура», критерии1) => правда
(«мой дом / первый этаж / гостиная / яркость», критерии1) => false
(«мой дом / первый этаж / гостиная / температура», критерии1) = > false
("гараж / первый этаж / холодильник / температура", критерии 1) => false
("мой дом / первый этаж / гостиная / температура", критерии 2) => true
("мой дом / первый этаж / кухня / яркость", критерии 2) => правда
(»гараж / цокольный этаж / холодильник / температура / более / специфические / поля ", критерии 2) => верно
(" мой дом / первый этаж / гостиная / температура ", критерии 2) => false
("myhome / подвал / угол / температура", критерий 2) => false
("music / kei $ ha / latest", "+ / kei $ ha / +") => true
a/b/c
не соответствует критериямa/b
, поэтому я склонен сказать нет .Ответы:
Желе , 20 байт
Монадическая ссылка, принимающая список списков символов
[topic, pattern]
, который возвращается1
либо0
для совпадения, либо для несоответствия соответственно.Попробуйте онлайн! Или посмотрите тестовый набор .
Как?
источник
Рубин , 65 байт
Регулярное решение. Я добавил, что
Regex.escape
в случае, если имя критерия окажется чем-то похожимcom.java/string[]/\n
или глупым, в котором будут кусочки регулярных выражений.Попробуйте онлайн!
Решение без регулярных выражений, 77 байт
Использует хорошую простую технику разделения, почтового индекса и соответствия. Сначала я разработал этот, прежде чем понял, что даже с
Regex.escape
помощью регулярных выражений все равно было бы короче.Попробуйте онлайн!
источник
.*?
должен работать вместо[^/]*
.a/+/d
с темойa/b/c/d
Perl 5
-pl
, 50 байтПопробуйте онлайн!
источник
<>=~/^$_$/
в концеPython 3 , 72 байта
Попробуйте онлайн!
Эту проблему можно легко упростить до соответствия регулярному выражению, хотя другой, более интересный метод может дать лучшие результаты.
РЕДАКТИРОВАТЬ Я придумал 107-байтовое решение, не использующее регулярные выражения. Я не знаю, может ли он стать короче 72 или, может быть, я просто не вижу правильного подхода к этому. Просто структура с разрезом на молнии кажется слишком большой. Попробуйте онлайн!
источник
f('myhome/ground$floor/livingroom/temperature', 'myhome/ground$floor/+/temperature')
что не удается+/kei$ha/+
не совпадаетmusic/kei$ha/latest
.Python 2 ,
8584809289 байтПопробуйте онлайн!
Спасибо Джонатану Аллану и Value Ink за указание на ошибки.
источник
f('ab', 'abc')
.Haskell,
76737167 байтПопробуйте онлайн!
Изменить: -4 байта благодаря @cole.
источник
a#b=a==b
Кажется, работает на несколько байтов меньше, если я что-то упустилClojure ,
107917665102 байтАнонимная функция возвращает тему как правдивую и
nil
ложную (действует в Clojure).107 102 работает
91 76 65 все побеждены с помощью регулярных символов
источник
music/kei$ha/latest
и критериев+/kei$ha/+
(который должен соответствовать и является действительным ASCII).Котлин , 106 байт
Попробуйте онлайн!
источник
Python 3,
9988 байтБез использования регулярных выражений. С некоторой помощью Джонатана Аллана и Часа Брауна.
источник
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:])
сохраняет 12. Однако это не обрабатывает некоторые крайние случаи, такие какf('abc/ijk/x', 'abc/+/xyz')
илиf('abc/ijk/xyz', 'abc/+/x')
, которые могут быть исправлены с помощью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')
иf('abc/de','abc')
(оба должны вернутьсяFalse
, но вместо этого естьIndexError
)....or p[:1]in(s[:1],'+')and...
исправляет крайние случаи @ChasBrown, и я указал на стоимость 2 байта.f('a/b', 'a/+')
), но исправимый в 0 байтах с...or(s[:1]in'/')*2:])
.Древесный уголь , 36 байт
Попробуйте онлайн! Ссылка на подробную версию кода. Выходы
-
(неявный выход Charcoal дляtrue
) для совпадения, ничего для совпадения. Объяснение:Разделить тему на
/
с.Разделить критерии на
/
с.Если критерий содержит (т. Е. Заканчивается),
#
то удалите его и обрежьте тему до новой длины критерия.Если критерий содержит,
+
замените этот элемент в теме с+
.Сравните предмет с критериями и неявно напечатайте результат.
источник
Сетчатка 0.8.2 , 42 байта
Попробуйте онлайн! Объяснение:
Суффикс
/
к обеим строкам.Повторно удаляйте первый элемент как предмета, так и критерия, пока они равны или элемент критерия является (счастливым)
+
.Критерии совпадают, если это просто
#
(с тем,/
что было добавлено ранее), в противном случае и тема, и критерии должны быть пустыми к этому моменту.источник
Pyth , 22 байта
Попробуйте онлайн!
источник
Желе ,
2219 байтПопробуйте онлайн!
Монадическая ссылка, которая принимает в качестве аргумента
[topic], [criterion]
и возвращает1
совпадение и0
отсутствие совпадения.источник
JavaScript,
6966 байтПопробуйте онлайн!
источник
music/kei$ha/latest
и критериев+/kei$ha/+
(которые должны соответствовать и действительны в ASCII).Python 3 ,
149148 байтПопробуйте онлайн!
источник
05AB1E , 21 байт
Ввод в виде списка в порядке
[criteria, topic]
.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник