Проверка всех возможных вариантов
Добрый день,
Есть столбцы, которые могут расшириться, но думаю не более пяти. Строки будут увеличиваться постоянно. Значения будут всегда разными. Например: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 Каждую строку надо сравнить с результатом (обозначим: "счёт"), но по особому. Хочу, чтобы программа учла все возможные варианты. Например сначала сравнить каждый столбец с "счёт", потом столбы 1 2, 1 3, 1 4, 1 5, 1 6, 1 7, 1 8, 1 9, 1 10 с "счёт" 2 1, 2 3, 2 4, 2 5, 2 6, 2 7, 2 8, 2 9, 2 10 с "счёт" ... 1 2 3, 1 2 4, 1 2 5, 1 2 6, 1 2 7, 1 2 8, 1 2 9, 1 2 10 с "счёт" 1 3 2, 1 3 4, 1 3 5, 1 3 6, 1 3 7, 1 3 8, 1 3 9, 1 3 10 с "счёт" и так вплоть до 1 2 3 4 5 6 7 8 9 10 с "счёт" Каждый возможный вариант, я потом должен сохранить результат сравнения, Например (истина/ложь) Далее результат всех возможных вариантов каждой строки, хочу сравнить и выловить самый лучший вариант, подходящий к результату "счёт" Дабы потом к этим столбцам поставить одно самое эффективное условие) Так вот, суть вопроса, посоветуйте, как мне в автоматическом режиме проверить все возможные комбинации проверки? (в ручную делать с помощью множества конструкций if ((1) && (2) && (3) === счёт) все возможные варианты, крайне не благодарное дело. По любому есть более простой элегантный способ проверки с менее объемом строк кода, но я никак не придумаю как) |
Используйте циклы.
|
Да циклы - это понятно, я не могу придумать алгоритм, как их использовать(
|
Цитата:
есть простейший вариант, но там подмножества будут в другом порядке: var N = 10; for (var i = 1, max = Math.pow(2, N); i < max; ++i) { var value = ...; for (var j = 0; j < N; ++j) { var k = (i >> j) & 1; // надо ли учитывать j-й элемент на данной итерации value = value && ((j) && k); } if (value === "счёт") ... } если надо соблюсти указанный порядок, то там рекурсия будет. |
:-?
|
Evelate, я не совсем понял чего вы хотите.
Есть таблица (<table/>): 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 И число ("счет"): 50; Каким образом нужно производить проверку? Нужно взять первую строку, первую ячейку этой строки и сравнить её со счетом? Или нужно взять сумму (всех строк) первого столбца и сравнить её со счетом? Далее увеличивая кол-во используемых для сравнения столбцов. |
Пожалуй не так написал, что мне нужно)
"Нужно найти <b>все</b> возможные комбинации и сохранить их в массив" Например 2 столбца. Каждый столбец имеет переменную с данными "1" a = 1; b = 1; c = 1; происходит парсинг всех возможных комбинаций, все они должны сохранится в массив для дальнейшего сравнения) комбо 1: a - arr[0] = [a] комбо 2: b - arr[1] = [b] комбо 3: c - arr[2] = [c] комбо 4: a b - arr[3] = [a, b] комбо 5: a c - arr[4] = [a, c] комбо 6: b c - arr[5] = [b, c] комбо 7: a b c - arr[6] = [a, b, c] Из экселя я беру данные из определенных столбцов - сохраняю в переменные и сравниваю их с массивом из шаг №1 Например: Входные данные также будут 1 или 0. строка №1 из экселя: var1 = 1, var2 = 0, var3 = 1; строка №2 из экселя: var1 = 0, var2 = 0, var3 = 1; Дальше пока что смутно представляю реализацию... как-то надо сопоставить "var1" с "b" и "var2" с "a" и "var3" c "c" Далее, Первый проход: если "а" есть в массиве в текущем прохождении цикла, начать сравнивать её только с var2 каждой строки если "а" и "b" есть в массиве в текущем прохождении цикла, начать сравнивать её только с var2 и c var1 каждой строки выглядеть примерно должно так: excel парсер с циклом "i" - массив комбинаций с циклом "j" строка 1: var1 = 1, var2 = 0, var3 = 1; a - if (var2 === a) { counter[j][переменная1]++ } else if var2 !== a { counter[j][переменная2]++ } b- c- a b - if ((var2 === a) && (var1 === b)) { counter[j][переменная1]++ } else if ((var2 !== a) || (var1 !== b)) { counter[j][переменная2]++ } a c- b c- a b c- строка 2: var1, var2, var3 a- b- c- a b- a c- b c- a b c- ... Потом я буду смотреть лучший результат между всеми переменными в counter[] и выберу несколько лучших комбинаций для использования в своих целях) загвоздка в шаге 1 - вообще не представляю, как сделать, да и потом шаг два сопоставление не имею представления, как сделать) Может у вас будет более простое решение? |
Цитата:
и коим боком к экселю js? чем встроенный vba не устроил? |
Часовой пояс GMT +3, время: 13:39. |