Это обновление моего участия в конкурсе #100DaysOfCode.

В последнее время у меня был очень разносторонний опыт решения задач с точки зрения моей способности это делать. С некоторыми проблемами я могу сидеть и в конечном итоге работать, в то время как с другими проблемами я полностью потерян, практически не имея представления о том, как хотя бы отдаленно подойти к ним. Обычно именно в этих последних задачах я в конечном итоге смотрю на решения и работаю над ними, чтобы понять различные аспекты кода, и он работает так, как работает. Цель состоит, конечно же, в том, чтобы извлечь все возможные знания из каждой задачи, независимо от того, смогу ли я решить ее полностью самостоятельно или нет.

Задача, над которой я работал сегодня, была одной из таких задач. Чем больше я сидел с проблемой, тем более запутанным и обширным становилось решение. Было много возвратов, боковых маршрутов и ссылок, пока я, наконец, не уступил идее, что я НАМНОГО переосмыслил проблему. Я поддался, глядя на намеки. Это совсем не помогло. У меня уже были первые несколько подсказок, настроенных в моем собственном коде.

Когда я, наконец, посмотрел на решения и выбрал одно из них для работы, я заметил две вещи:

  1. Я определенно переосмыслил это. Фрагменты, которых мне не хватало, были значительно меньше, чем все, что я придумал в уме в качестве жизнеспособного пути к решению проблемы, и
  2. Было использование функции, которая сама по себе имела две вещи: это было что-то, о чем я никогда не слышал и на что не смотрел (евклидов алгоритм), и она была рекурсивной.

Конечно, это было рекурсивно.

let lcm = blah[0];
for (let i = 1; i < blah.length; i++) {
  var GCD = gcd(lcm, blah[i]);
  lcm = (lcm * blah[i]) / GCD;
}
return lcm;
function gcd(x, y) {
  // Implements the Euclidean Algorithm
  if (y === 0) return x;
  else return gcd(y, x % y);
}

Код скопирован, адаптирован.

Я подключил фрагменты кода к своему коду, и он заработал. Однако, все еще чувствуя себя обманутым, я рассмотрел и другие решения. Когда я вернулся к решению, которое выбрал для подражания, в одном из комментариев было предложено то, над чем я мог реально поработать: // can use reduce() in place of this block.

Я использовал метод .reduce() только мимоходом и обычно для суммирования значений в массиве. Однако блок, который я должен был заменить, имел несколько более сложную функцию для рефакторинга. Поэтому я начал копаться в Google, чтобы лучше понять .reduce() и посмотреть, смогу ли я понять, как заменить эти пять строк кода всего одной.

Во-первых, позвольте мне сказать вам, что попытка найти полезную информацию о методе .reduce(), которая не повторялась снова и снова, была проблемой сама по себе. Почти в каждой статье, с которой я сталкивался, говорилось о .reduce() с точки зрения суммирования значений в массиве.

Почти каждый. не замужем. бля. один.

Почти. К счастью, я наткнулся на две статьи, которые оказались полезными во многих отношениях. Первой была эта статья от gURLmeetsCode, в которой сравнивалась производительность между for циклами и .reduce(). Это было очень информативно с точки зрения зачем учиться использовать .reduce(), так как теперь понятно, почему я хотел бы использовать его сверх того, что просто лучше выглядящий код.

Второй статьей была эта, написанная Дэвидом Уолшем, который привел ряд примеров, демонстрирующих множество способов использования .reduce(). И это не было набором различных способов суммирования элементов массива. Он показал, как можно использовать .reduce() для получения массива и возврата одного результата, каким бы он ни был. Работая с его примерами, я смог лучше понять, как я могу реорганизовать фрагменты кода, которые я использовал, из цикла for в цикл .reduce(). Путем проб и ошибок я получил вот это:

let lcm = blah[0];
for (let i = 1; i < blah.length; i++) {
  var GCD = gcd(lcm, blah[i]);
  lcm = (lcm * blah[i]) / GCD;
}

в это:

let lcm = blah.reduce((lcm, i) => (lcm * i) / gcd(lcm, i));

Аааа, я кое-что узнал! Меня разочаровало то, что мне пришлось вернуться к сканированию решения, но, в конце концов, весь этот опыт был полезен, поскольку я узнал немного больше об одном из многих инструментов в моем наборе инструментов.

37/100