Менять порядок элементов списка исходя из кратности входящего числа 5-ти

Предположим, у меня есть список дней недели:

let days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

И есть диапазон чисел от 1 до 1001. Как написать код так, чтобы при каждом number % 5 == 0 первый элемент списка попадал в конец. В функцию при этом должно задаваться только число, диапазон от 1 до 1001 подразумевается уже внутри. В итоге должно получиться следующее:

При number == 5:

let days = ['Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday']

При number == 10:

let days = ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']

и т.д.

Есть такое условие еще: однако из кратных 100 сдвигать лишь кратные 500, например, 700, 800, и 900 - не менять список, 1000 - менять.

Если нужна дополнительная информация, задавайте вопросы.

Спасибо


Ответы (1 шт):

Автор решения: OPTIMUS PRIME

let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];

console.log( bubu( 5) ); // [ "Tuesday", "Wednesday"...
console.log( bubu(10) ); // [ "Wednesday", "Thursday"...
console.log( bubu(15) ); // [ "Thursday", "Friday"...
console.log( bubu(35) ); // [ "Monday", "Tuesday"... (зациклилось)

function bubu(n) {
  if (n % 100 == 0 && n % 500 != 0) return days.slice(0);
  // Кратно 100, но не кратно 500 — не трогать массив (return прерывает функцию)

  let delta = (n / 5 | 0) % days.length;
  
  return [].concat( days.slice(delta), days.slice(0, delta) );
}
code { white-space: nowrap !important; }

let delta = (n / 5 | 0) % days.length;

n / 5 | 0 — равносильно Math.trunc( n / 5 ), а-ля целочисленное деление. Находит, сколько пятерок "поместится" в n. Скажем, для 100 → 20 штук.

Но зачем 20 раз кругами перекладывать элементы, если оно через каждые 7 штук встает на начальную позицию? 20 % 7 → 6 (остаток от деления 20 на 7), значит нужен сдвиг на 6 позиций. Можно разрезать массив на 6-й позиции и приклеить куски в обратном порядке.


* return days.slice(0);.slice(0) создает новый массив из элементов days. Сделан так вместо return days; потому что не известно, что должны делать с полученным массивом. Будет не приятно, если его случайно пересортируют, перепишут элементы или еще что-то (см. «Мутация массива»).

→ Ссылка