Как перемешать строки так, чтобы их значения повторялись не менее чем через 4 строки?

В Google Sheets у меня есть список с именами. В этом списке имена повторяются несколько раз.

Нужно этот список рандомно отсортировать, но при этом если список условно разбить на группы по 4 пункта, то в каждой группе имена не должны повторяться.
  • Вопрос задан
  • 351 просмотр
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Sheets
Google Products Expert
Не самый лучший вариант, т.к. очень сильно нагружает систему, но если данных немного, то можно как-то так

function myFunction() {
  const arr = [1, 2, 2, 3, 34, 54, 3, 4, 45, 34, 53, 45, 4, 1, 23, 12, 3, 235, 2, 5, 1, 2, 6, 76, 54, 6, 84, 5, 23, 2, 34, 6, 735];
  const done = [];
  let attempts = 5;
  while (attempts--) {
    const a = [...arr];
    const res = [];
    const exclude = [];
    while (a.length) {
      const index = Math.floor(Math.random() * a.length);
      const v = a[index];
      if (exclude.indexOf(v) === -1) {
        a.splice(index, 1);
        res.push(v);
        exclude.push(v);
        if (exclude.length > 4)
          exclude.shift();
      } else if (!a.filter(v => exclude.indexOf(v) === -1).length) {
        console.log('break', a, exclude);
        break;
      }
    }
    if (!a.length) {
      done.push(...res);
      break;
    }
  }
  console.log(done);
}


Пример в Таблице https://docs.google.com/spreadsheets/d/1lUHQ89Dsc6...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ProgrammerForever
@ProgrammerForever Куратор тега Google Sheets
Учитель, автоэлектрик, программист, музыкант
1) Отсортировать
2) Взять в порядке 1-5-10...2-6-11...3-7-12...
const a = [1,2,2,3,34,54,3,4,45,34,53,45,4,1,23,12,3,235,2,5,1,2,6,76,54,6,84,5,23,2,34,6,735];

  let outData = [];
  const n = 5; // Ширина блока
  for(let offset=0; offset<n; offset++){
    for(let i=offset; i<a.length; i+=n){
      outData.push(a[i]);
    };
  };

  Logger.log(JSON.stringify(outData));
//Проверка на то, что все элементы исходного массива включены
  Logger.log(JSON.stringify(outData.sort()));
  Logger.log(JSON.stringify(a.sort()));
Ответ написан
Ваш ответ на вопрос

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

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