Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.11.2017, 13:56
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

Алгоритм разбора данных
Прилетает строка, возможно со всяким муссором, вот такого вида:
Включить пожалуйста воду и свет
муссор тут "пожалуйста и"
Мне нужно делать определенные действия, т.е. если есть подстрока "включить" с ключевыми словами "воду" "свет", то включаем воду и включаем свет, если "выключить", то выключаем.
Команд с разными опциями может быть много: включить, выключить, перейти, установить и т.п. и просто перебирать if'ами не хотелось бы, например так:

//Это переменная со строкой данных
var instr;

if (instr.search('включить') != -1){
    if (instr.search('обогрев') != -1){
     
    }
    if (instr.search('свет') != -1){
     
    }
    if (instr.search('воду') != -1){
        if (instr.search('теплице') != -1){
     
    }
        if (instr.search('кухне') != -1){
     
    }
     
    }
    if (instr.search('полив') != -1){
     
    }
}
Ответить с цитированием
  #2 (permalink)  
Старый 11.11.2017, 16:18
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Lion777,
для медитации ...
применение-побитовых-операторов #маска
Ответить с цитированием
  #3 (permalink)  
Старый 11.11.2017, 20:19
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

Вариант передачи данных интересный, но мне надо будет распарсить результат всеравно, с помощью тип switch или if, но вариант интересный, для передачи по сети отличный вариант, трафика минимум уйдет, мне для общения с микроконтроллером подойдет, я раньше тип как методом гет, а тут в одно число можно все закодировать
---
А )) не совсем подходит, мне надо будет передавать не только булевы значения, а и строки

Последний раз редактировалось Lion777, 11.11.2017 в 20:35.
Ответить с цитированием
  #4 (permalink)  
Старый 11.11.2017, 21:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

каждому слову сделать вес -- сложить все веса - проверить все тригеры на этот вес - включить тригеры прошедшие фильтрацию
Ответить с цитированием
  #5 (permalink)  
Старый 11.11.2017, 22:57
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

я думал так, взять 30 бит, например, первых(или точнее - последних) 5 будет отвечать за команду, тип 10000 - включить, 10001 - выключить, 10010 - и т.д получится 31 разных команд, остальные по 5 подкоманды, тип 00001 - воду на кухне, 00010 - свет, 00011 - воду в теплице
10000 00000 00011 00010 00000 00001 , например тут при команде 10000 "включить" подкоманда "00001" будет значить " включить воду на кухне", для другой основной команды подкоманда "00001" будет иметь инное значение ))) или это какой-то велосипед ?))
___
можно вообще взять 8 бит и зашифровать в 256 разные команды, тип 0 - включить воду, 1- выключить воду, 2- включить свет, 3-выключить свет, но тут вложенности не получится, тип включить->воду->на кухне

Последний раз редактировалось Lion777, 11.11.2017 в 23:04.
Ответить с цитированием
  #6 (permalink)  
Старый 11.11.2017, 23:27
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion777
тип 00001 - воду на кухне, 00010 - свет, 00011 - воду в теплице
Лучше так - [команда][данные][адрес], где команда, это операция, данные, это указатель на объект (вода, свет, ....), адрес, это указатель на целевой объект (кухня, теплица, ...).

Соответственно отведя под каждую часть необходимое число бит. Формат команды будет проще и ее длина гораздо короче.
Ответить с цитированием
  #7 (permalink)  
Старый 12.11.2017, 00:33
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

Это все хорошо,но как разбирать все эти команды без кучи if'ов
тип собрал команду включить->свет->на кухне->возле холодильника->код?
Ответить с цитированием
  #8 (permalink)  
Старый 12.11.2017, 01:54
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,103

Lion777,
как - то так ...
<script>
var obj = {"Включ" : 1, "вод" : 2, "свет" : 4} , triger = [{wt : obj["Включ"]|obj["вод"], title : "включить воду"}, {wt : obj["Включ"]|obj["свет"], title : "включить свет"}]
function fn(str) {
    var key = str.split(/\s+/).reduce(function(s, a) {
        Object.keys(obj).forEach(function(k) {
            if (a.toLowerCase().indexOf(k.toLowerCase()) !== -1) s |= obj[k]
        });
        return s
    }, 0);
    return triger.filter(function(el) {
               return (key & el.wt) == el.wt
    });
};

document.write(JSON.stringify(fn("Включить пожалуйста воду и свет"))+"<br>")

document.write(JSON.stringify(fn("Включить пожалуйста воду"))+"<br>")

document.write(JSON.stringify(fn("Включить пожалуйста свет"))+"<br>")
document.write(JSON.stringify(fn("свеТ вклЮчить скорее"))+"<br>")

document.write(JSON.stringify(fn("Включить пожалуйста радугу"))+"<br>")
</script>
Ответить с цитированием
  #9 (permalink)  
Старый 12.11.2017, 08:40
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Lion777
как разбирать все эти команды без кучи if'ов
Знать бы для чего все это пишется. Может быть почитать об архитектуре микроконтроллеров, например от Microchip? Например, для семейства PIC16C5X длина инструкции составляет 12 бит, которые разделены на тип команды и на операнды. Операнды, это регистры, биты или байты (для бит или байт ориентированных команд).

За небольшим исключением команды этого семейства выполняются за один командный цикл. Команды проверяющие условия или изменяющие программный счетчик выполняются за два командных цикла. При этом, имея небольшой набор команд могут нести на борту различные функциональные устройства, от таймеров, и АЦП, до связи по Интернет, что позволяет создавать на них самые различные устройства.

По такому же принципу и ваш контроллер должен работать. К примеру ваши команды занимают два бита в инструкции: 00 - выключить, 01 - включить, 10 - получить. Следующая пар бит определяет устройство: 00 - свет, 01 - вода, 10 - холодильник. И последняя пара, это помещение: 00 - комната, 01 - кухня, 10 - ванная.

Две последних пары бит в инструкции определяют адрес порта вывода - первая задает номер порта, вторая биты этого порта закрепленные за помещением. Например в комнате может иметься только устройство свет и для нее определен только один номер порта, в тоже время на кухне могут быть три устройства, и для нее отводится три номера порта вывода.

Дешифратор команд должен последовательно декодировать каждую и исполнять. В памяти программ команды идут одна за другой и нет никаких пробелов, но пусть у вас они будут представлены таким образом:

010001
011001

Дешифратор разбивает поток команд по \n, затем извлекает биты инструкции, например по шаблону рег. выражения. Далее выполнение - определить порт, установить/получить состояние порта. Если ваша задача вывести текст по команде, значит битовые значения можно преобразовать в десятичные, которые есть свойства объекта содержащие текст.

Какие либо if здесь не потребуются. Но если команда включить/выключить, это установить 1/0 на выходе указанного порта, то команда "получить", это считать состояние порта, передать его программе, которая и будет это состояние анализировать. А уже по результату может включать/выключать, запускать подпрограммы и т.д.
Ответить с цитированием
  #10 (permalink)  
Старый 12.11.2017, 15:19
Кандидат Javascript-наук
Отправить личное сообщение для Lion777 Посмотреть профиль Найти все сообщения от Lion777
 
Регистрация: 04.11.2017
Сообщений: 117

Ребята, благодарю за подсказки.
Ну это тип управление умным домом, захотел добавить еще голосовое управление, но что-бы оно было тип умное ), что-бы фразы были не строго "однотипные" тип "Включить воду", а тип "Включите пожалуйста воду и свет" слова-муссор удалялись и собиралась команда, ну и собранная команда шла на исполнение, но в ифы добавлять тупо, если их будет множество...
---
рони, хотел еще спросить, зачем использовать побитовое или "|" в "wt : obj["Включ"]|obj["вод"]", ведь если там будут числа 9,10,11 и т.п. то будет неверно складывать ?

Последний раз редактировалось Lion777, 12.11.2017 в 15:29.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при обработке данных TBUCTEP Общие вопросы Javascript 11 12.05.2017 14:56
AJAX меняет символы при отправке данных fenix_63 AJAX и COMET 6 17.11.2015 14:20
Не понимаю JavaScript. Как сделать ожидание события загрузки данных? xintrea AJAX и COMET 7 01.06.2013 17:18
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Изменение окраски строк таблицы, исходя из данных? Space-06 Events/DOM/Window 4 14.02.2012 21:32