@New-Developer
Изучаю JavaScript

Можно ли здесь избавиться от цикла while?

Есть функция для нахождения суммы всех минимальных одинаковых элементов массива. Принимает массив из положительных целых чисел. Можно ли обойтись без while ?
function solution(n) {
    while (!n.every(x => x == n[0])) {
        n.sort((a, b) => b - a).forEach((v, i) => n[i - 1] > m ? n[i - 1] % m != 0 ? n[i - 1] = n[i - 1] % m :
            n[i - 1] = m : v, m = Math.min(...n))
    }
    return n[0] * n.length
}

Можно ли перезапускать вложенный цикл с помощью reduce() или добавлением условия в forEach() ?
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
WblCHA
@WblCHA
Как я не пытался, я так и не понял в чём заключается задача, но, переписав код, я таки выкинул ряд бесполезных проверок и столь же бесполезную сортировку, а также, технически, избавился от вайла.)
Вариант 1
(() => {
  const solution = (arr, iteration = 1) => {
    if(arr.every(num => num === arr[0])) {
      return arr[0] * arr.length;
    }
    
    const minNum = Math.min(...arr)

    arr.forEach((num, i) => {
      if(num > minNum) {
      	arr[i] = num % minNum || minNum;
      }
    });

    console.log(`Iteration ${iteration}`, arr);
    
    return solution(arr, iteration + 1);
	}
  
  console.log(solution([6,9,21]));
  console.log(solution([56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 142]));
})()

Вариант 2
(() => {
  const solution = (arr, iteration = 1) => {
    const minNum = Math.min(...arr);
    let hasDif = false;

    arr.forEach((num, i) => {
      if(num > minNum) {
        hasDif = true;
      	arr[i] = num % minNum || minNum;
      }
    });
    
    if(hasDif) {
   		console.log(`Iteration ${iteration}`, arr);

    	return solution(arr, iteration + 1);
    }
    
    return arr[0] * arr.length;
	}
  
  console.log(solution([6,9,21]));
  console.log(solution([56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 142]));
})()

Вариант 3
(() => {
  const solution = (arr) => {
    let iteration = 1;
    const baseSet = new Set(arr);
    
    if(baseSet.size < 2) {
      return arr[0] * arr.length;
    }
    
    const solve = (set) => {
      const minNum = Math.min(...set);
      const nextSet = new Set();

      set.forEach((num, i) => {
        if(num > minNum) {
          nextSet.add(num % minNum || minNum);
        }
      });
      
      if(nextSet.size < 2) {
        return minNum * arr.length;
      }
      
      console.log(`Iteration ${iteration}`, arr);
      
      return solve(nextSet);
    }
    
    return solve(baseSet);
	}
  
  console.log(solution([6,9,21]));
  console.log(solution([56, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 142]));
})()

П.с.: чего только не сделаешь, чтобы не лечь спать...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
Sportrecs Москва
от 150 000 до 200 000 ₽
25 нояб. 2020, в 19:58
35000 руб./за проект
25 нояб. 2020, в 19:13
1000 руб./в час
25 нояб. 2020, в 18:34
100000 руб./за проект