At Vatu Ltd, we have 3 main goals: Create high-quality websites Give great customer service to our clients Create a happy, safe,...
Project Euler with ES6 – Problem 1
When ECMAScript 2017 was finalized in June I felt that I was not completely comfortable with the language features introduced in ECMAScript 6. ? To fix that I started solving the exercises at Project Euler using as many ES6 features as possible. This is Problem 1:
If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below 1000.
I broke this problem down into three parts:
- Generate the natural numbers below 1000
- Filter out those that are not a multiple of 3 or 5
- Add them together
1. Generating natural numbers
A generator is a function that pauses its own execution with the yield keyword. It is defined by putting a * after function like so:
// Natural numbers as a generator function* naturalsGenerator() { let n = 1; while (true) { yield n; n++; } } let naturals = naturalsGenerator(); console.log(naturals.next()); // { value: 1, done: false } console.log(naturals.next()); // { value: 2, done: false } console.log(naturals.next()); // { value: 3, done: false } let naturals2 = naturalsGenerator(); console.log(naturals2.next()); // { value: 1, done: false } console.log(naturals2.next()); // { value: 2, done: false }
Natural numbers are infinite so naturalsGenerator() contains an infinite loop. The above code doesn’t run forever, however, because yield n; pauses the execution.
The let keyword is var without the hoisting.
Generators can have parameters, which is useful because the problem asks for natural numbers below 1000:
// Natural numbers as a generator with a limit parameter function* naturals(limit) { for (let n = 1; n <= limit; n++) { yield n; } } let nat999 = [...naturals(999)]; console.log(nat999.length);
This also uses the spread operator, which here expands the contents into an array.
2. Array filtering
With an array containing the natural numbers from 1 to 999, it is time to keep the elements that are multiples of 3 or 5. Arrow functions make this more compact than was possible before:
// ES5 var old_filtered = nat999.filter(function(x) { return x % 3 == 0 || x % 5 == 0; }); // ES6 let new_filtered = nat999.filter(x => x % 3 == 0 || x % 5 == 0);
More important than saving keystrokes is the way arrow functions handle the this keyword.
3. To sum up
Adding it all up can also be done with an arrow function. The final result:
// Natural numbers as a generator function* naturals(limit) { for (let n = 1; n <= limit; n++) { yield n; } } // The sum of the multiples of 3 or 5 below 1000 console.log([...naturals(999)] .filter(x => x % 3 == 0 || x % 5 == 0) .reduce((a, b) => a + b)); // 233168
All code was tested on Node v8.1.4.
You must be logged in to post a comment.