Начнем с первой и простейшей задачи из серии Project Euler. Все статьи о решениях будут следовать той же схеме, что и эта. Он будет разбит на подразделы, и все решения JavaScript будут доступны в моем Github Repo.

Постановка задачи

Если мы перечислим все натуральные числа ниже 10, которые кратны 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных 23.

Найдите сумму всех кратных 3 или 5 меньше 1000.

Анализ проблемы

Мы можем разбить проблему на три подраздела.

  1. Нам нужно получить список всех натуральных чисел меньше 1000.
  2. Отфильтруйте числа так, чтобы остались только числа, кратные 3 и 5.
  3. Найдите сумму оставшихся чисел.

Необходимые знания

Базовые функциональные парадигмы JavaScript. Базовое понимание того, как работают Array.from, Array.filter и Array.reduce.

Реализация

Это довольно простой и понятный код. Поскольку это первая задача в наборе, позвольте мне объяснить.

  1. Мы используем Array.from для создания списка чисел до 1000.

2. К результирующему массиву применяется фильтр. Функция фильтра, которая при применении к массиву возвращает массив, удовлетворяющий функции предиката, которую мы ей передаем. В этом случае предикатная функция

number => number % 5 === 0 || number % 3 === 0

Это означает, что все числа, которые при делении на 5 или 3 дают нулевой остаток. Проще говоря, это функция-предикат, которой удовлетворяют только числа, кратные 3 или 5.

3. Мы используем Array.reduce для массива, полученного на шаге 2, чтобы найти сумму оставшихся чисел. Функция уменьшения принимает два аргумента. Функция редуктора и начальное значение для аккумулятора. Функция reducer выполнит цикл по массиву и получит текущий элемент в массиве вместе с текущим значением аккумулятора.

reduce( (sum, number) => sum + number, 0 )

В этом примере sum - аккумулятор, а number - текущий элемент в цикле. Мы возвращаем значение, которое получаем после добавления текущего числа к текущей сумме. Оператор возврата избегается, поскольку мы используем обозначение жирной стрелки из ES6. Следующая итерация получит это новое значение аккумулятора. Так далее и тому подобное. В качестве начального значения аккумулятора мы указали ноль.

Эту проблему можно легко решить с помощью всего лишь одного цикла for. Я сделал это с помощью filter и reduce, чтобы продемонстрировать функциональную сторону JavaScript. Поскольку это очень простая задача, меня не волнует временная сложность.

Результат

Вывод: 234168
Время выполнения на Macbook Pro 13 дюймов 2015: 0,472 мс
Время выполнения: Node.js v10.13.0

Щелкните здесь, чтобы перейти в репозиторий Github.

Подпишитесь, чтобы узнать больше. Следуй за мной @ ohmycode.in