I have solved the sum-of-multiples small puzzle like this:
function sum(multiples, limit_in) {
return [...multiples.map(n => [...range(n, limit_in, n)])
.reduce((numbers, array) => {
array.forEach(value => numbers.add(value));
return numbers;
}, new Set())
.values()]
.reduce((sum, n) => sum + n, 0);
}
function* range(start, stop, step = 1) {
if (stop == null) {
stop = start;
start = 0;
}
for (let i = start; step > 0 ? i < stop : i > stop; i += step) {
yield i;
}
}
const result = sum([5, 6, 8], 150);
console.log(result); // The result is 4419
Second version was something like this:
function sum(multiples, limit_in) {
return [...multiples.flatMap(n => [...range(n, limit_in, n)])
.reduce((numbers, value) => {
numbers.add(value);
return numbers;
}, new Set())
.values()]
.reduce((sum, n) => sum + n, 0);
}
function* range(start, stop, step = 1) {
if (stop == null) {
stop = start;
start = 0;
}
for (let i = start; step > 0 ? i < stop : i > stop; i += step) {
yield i;
}
}
const result = sum([5, 6, 8], 150);
console.log(result); // Result 4419
The question is it possible to make it more lazy?
Is there a way to flatten more the generator (function*): range(n, limit_in, n)
and not construct the array [...range(n, limit_in, n)]
?