Показать сообщение отдельно
  #15 (permalink)  
Старый 16.08.2017, 21:19
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,108

оптимизация: цикл только по "нужным" элементам, после найденного первого. (проще конечно for и break)
можно вводить в диапазон оба параметра
<html><meta charset="utf-8">
  <span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span>
  <br>
  <input type="number" value="8" oninput="test()" /> и
  <input type="number" value="28" oninput="test()" /> пересекается с
  <input id="result" disabled="true"   style="width: 500px;font-size:12px; "/>

  <style>
    body {text-align:center}
    span {display:inline-block; padding:15px; font-size:18px; font-family:consolas}
    input {width:100px; height:50px; font-size:35px; text-align:center}
  </style>

  <script>
    window.onload = test;

    var intervals = [
      {beg: 8,   end: 16},
      {beg: 24,  end: 32},
      {beg: 40,  end: 48},
      {beg: 56,  end: 64},
      {beg: 72,  end: 80},
      {beg: 88,  end: 96}
    ];

   function test(value) {
    var A = +document.querySelectorAll("input")[0].value;
    var B = +document.querySelectorAll("input")[1].value;

    function bin_search_range(arr, A) {
        var min = 0;
        var max = arr.length - 1;
        var temp = [];
        while (min < max) {
            var mid = Math.floor((min + max) / 2);
            if (arr[mid].end < A) min = mid + 1;
            else max = mid
        }
        if (arr[min].beg <= B && arr[min].end >= A) {
            arr.slice(min).some(function(el) {
                return !(el.beg <= B && el.end >= A && temp.push(el))
            });
            return JSON.stringify(temp)
        }
        return "..."
    }
    document.querySelector("#result").value = bin_search_range(intervals,A)
};
  </script>
</html>
Ответить с цитированием