function balance(arr1, arr2) {
let all = arr1.concat(arr2);
//all.sort((a, b) => a - b); //Для исключения одинаковых.
let all_sum = all.reduce((a,b)=>a+b,0);
let len = all.length;
let cnt = Math.floor(len * 0.5);
let arr_result = new Array(cnt); //Массив выбранных индексов
let idx_begin = 0; //Начальная глубина перебора (индекс в arr_result)
let sum_begin = 0; //Начальная сумма частично перебранных элементов
if (cnt === len * 0.5) { //Оптимизация
arr_result[0] = 0;
idx_begin = 1;
sum_begin = all[0];
}
let min_diff = all_sum; //Присваиваем какое-то заведомо большое число.
let arr_answer; //Итоговый ответ
//Проверяем следующий уровень глубины
//idx - глубина, sum - сумма всех элементов до этого
function check(idx, sum) {
if (idx === cnt) { //Конец перебора. Проверяем, подходит ли.
let diff = Math.abs((all_sum - sum) - sum);
if (diff < min_diff) { //Подходит
min_diff = diff; //Запоминаем новый лучший результат.
arr_answer = arr_result.slice(); //Копируем
}
return;
}
//Иначе идем дальше вглубь на следующий уровень.
let start = idx === 0 ? 0 : arr_result[idx-1] + 1;
let max = len - cnt + idx;
for(let i = start; i <= max; i++){ //Ключевой цикл алгоритма
//if (i > start && all[i] === all[i-1]) continue;
arr_result[idx] = i;
check(idx+1, sum+all[i]); //Рекурсия
}
}
check(idx_begin,sum_begin); //Начать перебор. Поехали!
arr1 = [];
arr2 = [];
//Фасуем полученный ответ по массивам уже в виде значений.
let j = 0;
all.forEach((e,i)=>{
if (i === arr_answer[j]) {
arr1.push(e);
j++;
} else arr2.push(e);
});
return {
arr1: arr1,
arr2: arr2,
sum1: arr1.reduce((a,b)=>a+b,0),
sum2: arr2.reduce((a,b)=>a+b,0),
}
}
var arr1 = [10, 300, 25, 75];
var arr2 = [50, 125, 500, 10];
balance(arr1, arr2);
var json_str = `,{"name":"Adhi Kot","id":"379","nametype":"Valid","recclass":"EH4","mass":"4239","fall":"Fell","year":"1919-01-01T00:00:00.000","reclat":"32.100000","reclong":"71.800000","geolocation":{"type":"Point","coordinates":[71.8,32.1]}},{"name":"Adzhi-Bogdo (stone)","id":"390","nametype":"Valid","recclass":"LL3-6","mass":"910","fall":"Fell","year":"1949-01-01T00:00:00.000","reclat":"44.833330","reclong":"95.166670","geolocation":{"type":"Point","coordinates":[95.16667,44.83333]}}`;
var i = 0;
while((i=json_str.indexOf('"recclass":"',i))!==-1) {
i+=12;
let j = json_str.indexOf('"',i);
let val = json_str.substring(i,j);
console.log(val); //выводим очередное значение
}
<?php
$arr = [100,125,75,175,25,300,275,325,375];
$step = 50;
$b = []; //-1 - deny, 0 - not set, 1 - has interval
$int = []; //intervals if necessary
$step2 = intdiv($step,2);
$arr = array_values(array_filter($arr, function($v) use ($step2,&$b,&$int) {
$i = intdiv($v,$step2);
$mod = $v % $step2;
$res = true;
if (isset($b[$i])) {
if ($b[$i] === -1) $res = false;
elseif ($mod < $int[$i][0] or $mod > $int[$i][1]) $res = false;
}
$b[$i] = -1;
$b[$i+1] = -1;
$b[$i-1] = -1;
if (!isset($b[$i+2])) {
$b[$i+2] = 1;
$int[$i+2] = [$mod,$step2];
} elseif ($b[$i+2] === 1) {
if ($int[$i+2][0] < $mod) {
$int[$i+2][0] = $mod;
if ($int[$i+2][0] >= $int[$i+2][1]) $b[$i+2] = -1;
}
}
if (!isset($b[$i-2])) {
$b[$i-2] = 1;
$int[$i-2] = [0,$mod];
} elseif ($b[$i-2] === 1) {
if ($int[$i-2][1] > $mod) {
$int[$i-2][1] = $mod;
if ($int[$i-2][0] >= $int[$i-2][1]) $b[$i-2] = -1;
}
}
return $res;
}));
var_dump($arr); // [100, 175, 25, 300, 375]
?>
function repairCase(str, substr) {
if (!substr) return ''; //Empty string
//let arr = []; //Найденные результаты. Для наглядного дебага
let str_upper = str.toUpperCase();
let sub_upper = substr.toUpperCase();
let len = sub_upper.length;
let index = 0; //Стартовая позиция
let max_score = -1; //Максимальная оценка на совпадение по регистру.
let answer = ''; //То, что вернёт функция.
while (true) {
let result = str_upper.indexOf(sub_upper, index); //Ищем позицию очередного куска
if (result == -1) break;
let found = str.substr(result, len); //Найденный кусок
let score = 0; //Оценка совпадения
for(let i=0;i<substr.length;i++) { //Простой алгоритм:: чем больше совпадений, тем лучше.
if (substr[i] == found[i]) score++; //Увеличиваем оценку за каждое совпадение по символу.
}
if (score > max_score) { //Нашли более подходящий результат
max_score = score;
answer = found;
}
//arr.push({ pos: result, found: found, score: score });
index = result + 1;
}
//console.log(arr); //Смотрим, что под капотом
return answer;
}
repairCase('Hello World', 'hell'); // 'Hell'
repairCase('Алан Тьюринг', 'а'); // 'а'
repairCase('Дональд Кнут', 'Н'); // 'н'
repairCase('Линус Торвальдс', 'ндc'); // ''
const ip4ToInt = ip =>
ip.split('.').reduce((int, oct) => (int << 8) + parseInt(oct, 10), 0) >>> 0;
const isIp4InCidr = ip => cidr => {
const [range, bits = 32] = cidr.split('/');
const mask = ~(2 ** (32 - bits) - 1);
return (ip4ToInt(ip) & mask) === (ip4ToInt(range) & mask);
};
const isIp4InCidrs = (ip, cidrs) => cidrs.some(isIp4InCidr(ip));
isIp4InCidrs('192.168.1.5', ['10.10.0.0/16', '192.168.1.1/24']); // true