Если каждая из групп содержит 2 значения точно (я буду обращаться, если не слишком), то мы можем сохранить числа с нечетным индексом, чтобы продолжать создавать стену между ними. например,
Группы
[ [1,2], [3,4], [5, 6], [7, 8] ]
Начинается с [1, 2]
исходного массива
обработать следующий -> [3, 4]
удар по индексу 1
и 4 по индексу 3
, чтобы он стал [1, 3, 2, 4]
Теперь обработайте следующий ([5,6]
) и сделайте то же самое, чтобы получилось: [1, 5, 3, 6, 2, 4]
, затем обработайте следующее и продолжите.
Теперь, если есть группы, которые могут иметь произвольную длину! Итак, теперь вот проблема (Bang On! Вот почему я пришел сюда)
Сначала мы должны понять, когда (при каких условиях) это можно сделать! Если существует группа длиной L
, а сумма всех остальных групп равна M
, то
N - M should be <= 1
Почему?
Давайте предположим, что в группе есть 3
участников, чтобы разделить их, вам нужно минимум 2 стены. Итак, все остальные группы объединения должны иметь длину 2
.
Итак, если условие выполнено, нам нужно создать пары (потому что теперь это возможно)
- Первый шаг, отсортировать массив групп desc по их длине
- Нам нужно начать с первого, но нам нужно продолжение
нечетные индексы, если вторая группа не испортила первую группу
полностью.
Предположим, Группы :
[[1, 2, 3, 4, 5, 6], [7,8,9], [10, 11, 12], [...], [.....]]
Поскольку первая группа имеет длину 6
и 5
элементов, необходимых для полного ее удаления, следующая группа [7, 8, 9]
имеет длину 3
, поэтому определенно ей нужно 2
больше элементов, поэтому, когда мы начнем обработку следующую группу после размещения компонентов текущей группы в индексе 1, 3, 5
, мы должны начать размещение в 7, 9, ...
- Как только он отклонил первый массив, мы можем начать с индекса
1
и
сохраняя нечетные индексы.
Я могу создавать рабочий код по требованию, но как только станет ясно, что мы должны делать с частью кода, все мы можем легко это сделать. Ориентирован в основном на алгоритмическую часть. Однако я могу написать код, если это поможет!
ДОБАВЛЕНО пример реализации
var groups1 = [
[7, 8, 9],
[10, 11],
[1, 2, 3, 4, 5, 6],
[12, 13]
],
groups2 = [
[1, 2],
[3, 4],
[5, 6],
[7, 8]
];
function punchGroups(groups) {
groups.sort((a, b) => b.length - a.length);
let firstLen = (groups[0] || []).length,
oic = 0, //odd index increment counter
covered = false; //covered the largest array flag
return groups.reduce((acc, e) => {
if (!acc.length) {
return acc.concat(e)
}
e.forEach((n, i) => {
let idx = (covered ? (i * 2) : (oic++) * 2) + 1;
acc.splice(idx, 0, n);
covered = oic >= (firstLen - 1)
})
return acc;
}, []);
}
console.log('Groups: ', groups2);
console.log('Pairs: ', punchGroups(groups2));
console.log('-------------------------------');
console.log('Groups: ', groups1);
console.log('Pairs: ', punchGroups(groups1));
Что ж, теперь, чтобы иметь разные комбинации пар (очевидно, в пределах одной из возможных пар), вам просто нужно управлять groups
и членом групп во всех возможных комбинациях (просто используйте рекурсию, чтобы получить все комбо) и обрабатывать каждую иметь все разные возможные пары. Вы можете генерировать все выходные данные и выбирать один из них каждый день с индексом или некоторым фактором, который будет отличать ваш вызов, может быть метка времени, и рассчитать его для числа в пределах диапазона индекса всех возможных выходных массивов.