Цитата:
|
Цитата:
|
Пока вот так - возвращает первый слева элемент который пересекается с входным диапазоном.
Осталось найти все интервалы когда входной диапазон большой. <html> <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="" disabled="true" /> пересекается с <input id="result" disabled="true" /> <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 = A + 2; document.querySelectorAll("input")[1].value = B; function bin_search_range(arr, A) { var min = 0; var max = arr.length - 1; 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) { return arr[min].beg + "-" + arr[min].end; } return "..."; } document.querySelector("#result").value = bin_search_range(intervals, A); } </script> </html> |
Если диапазон большой и охватывает много интервалов, то лучше всего найти индексы первого и последнего интервалов (оба поиска - бинарные). Возможно, копировать все интервалы между ними в отдельный массив необязательно.
|
оптимизация: цикл только по "нужным" элементам, после найденного первого. (проще конечно 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> |
Цитата:
<html><meta charset="utf-8"> <span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span> <br> <input type="number" value="78" oninput="test()" /> и <input type="number" value="90" 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) { 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 } max = arr.length - 1; temp = min while (min < max) { var mid = Math.floor((min + max) / 2); if (arr[mid].beg < B) min = mid + 1; else max = mid } if (arr[temp].beg <= B && arr[temp].end >= A) { if (arr[min].beg <= B && arr[min].end >= A) ++min; return JSON.stringify(arr.slice(temp,min)) } return "..." } document.querySelector("#result").value = bin_search_range(intervals) }; </script> </html> |
рони, то что нужно!) Всем больше спасибо за помощь!
|
HJ90,
<html><meta charset="utf-8"> <span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span> <br> <input type="number" value="18" oninput="test()" /> и <input type="number" value="59" 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) { for (;arr.length; ) { if (arr[0].beg <= B && arr[0].end >= A) { break; } arr = arr.slice(1); } var i=arr.length; for (; i-- ;) { if (arr[i].beg <= B && arr[i].end >= A) { arr = arr.slice(0,++i); break; } } if (arr.length) { return JSON.stringify(arr) } return "..." } document.querySelector("#result").value = bin_search_range(intervals) }; </script> </html> |
HJ90,
<html><meta charset="utf-8"> <span> [8-16] [24-32] [40-48] [56-64] [72-80] [88-96] </span> <br> <input type="number" value="18" oninput="test()" /> и <input type="number" value="59" 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) { for (;arr.length; ) { if (arr[0].beg <= B && arr[0].end >= A) { break; } arr = arr.slice(1); } for (var i=0; i<arr.length; i++) { if (arr[i].beg <= B && arr[i].end >= A) continue; else {arr = arr.slice(0,i); break;} } if (arr.length) { return JSON.stringify(arr) } return "..." } document.querySelector("#result").value = bin_search_range(intervals) }; </script> </html> |
рони, круто! Правда с бинарным поиском меньше итераций получается.
|
Часовой пояс GMT +3, время: 07:22. |