@insanel

Как сделать алгоритм по подбору вариантов?

Суть вопроса:
С сервера летит массив данных, он может содержать в себе n элементов.

1) Нужно m раз получить пару из индексов массива, то есть - [ [x,y], .... , [z, c] ], причем пары в массиве не должны повторяться, то есть x != y && z != c && [x, y] != [z, c]

2) Затем получить рандомную выборку из, второй элемент пары [x, y] + 5 любых элементов, которые не равны x или y

Вариант ниже - невалидный
for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
        return [i, j]
    }
}


Как это сделать?
  • Вопрос задан
  • 92 просмотра
Решения вопроса 1
MagnusDidNotBetray
@MagnusDidNotBetray
Самый елеустремленный человек
Набросал что-то, разбирайтесь, если хотите:
const array = ['a', 'b', 'c', 'd', 'e', '1', '2', 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'j'];

const getRandowPairs = arr => {
  const sorted = [...new Set(arr)].sort((a, b) => Math.round(Math.random()) || -1);
  let res = [];
  for (let i = 0; i + 1 < sorted.length; i += 2){
    res.push([sorted[i], sorted[i + 1]]);
  }
  return res;
};

const getRandomArr = arr => {
  const index = Math.floor(Math.random() * arr.length);
  const item = arr[index];
  arr.splice(index, 1);
  arr = arr.flatMap(e => e);
  const set = new Set();
  while (set.size < 5){
    let i = Math.floor(Math.random() * arr.length);
    if (!item.includes(arr[i])){
      set.add(arr[i]);
    }
  }
  return [item[1], ...set];
};

console.log(getRandomArr(getRandowPairs(array))); // [ "c", "e", "h", "a", "1", "2" ]
console.log(getRandomArr(getRandowPairs(array))); // [ "1", "a", "d", "f", "h", "c" ]
console.log(getRandomArr(getRandowPairs(array))); // [ "f", "b", "j", "g", "a", "2" ]


Судя по последнему комментарию автора, нужно так:
const array = ['a', 'b', 'c', 'd', 'e', '1', '2', 'a', 'b', 'c', 'd', 'f', 'g', 'h', 'j'];

const getRandowPair = arr => {
  const sorted = [...new Set(arr)].sort((a, b) => Math.round(Math.random()) || -1);
  let res = [];
  for (let i = 0; i + 1 < sorted.length; i += 2){
    res.push([sorted[i], sorted[i + 1]]);
  }
  return res[Math.floor(Math.random() * res.length)];
};
const item = getRandowPair(array);
const set = new Set();
while (set.size < 5){
  let i = Math.floor(Math.random() * array.length);
  if (!item.includes(array[i])){
    set.add(array[i]);
  }
}
const result = [item[1], ...set];
console.log(result); // [ "e", "h", "c", "2", "j", "b" ]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы