patternjavascriptMajor
Sum all numbers in a range
Viewed 0 times
allnumbersrangesum
Problem
I have implemented the "Sum All Numbers in a Range" challenge from Free Code Camp quoted below.
The code works like a charm, but I don't think it's idiomatic. The challenge hints imply I should be using
I'm looking for a more idiomatic way to solve this. I think it can be done in a one-liner, something like:
But I'm pretty sure I'm heading the wrong way with the above.
The challenge:
We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.
The lowest number will not always come first.
The code:
Test cases:
Expected output:
The code works like a charm, but I don't think it's idiomatic. The challenge hints imply I should be using
Math.max(), Math.min() and Array.reduce(). In addition I used the spread operator from ES6 to simplify both Math calls.I'm looking for a more idiomatic way to solve this. I think it can be done in a one-liner, something like:
return arr.sort((function(a, b) { return a - b; })).reduce(function(a, b) { /* */ });But I'm pretty sure I'm heading the wrong way with the above.
The challenge:
We'll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.
The lowest number will not always come first.
The code:
function sumAll(arr) {
var out = 0;
for (var i = Math.min(...arr); i <= Math.max(...arr); i++) {
out += i;
}
return out;
}Test cases:
sumAll([1, 4])
sumAll([4, 1])
sumAll([5, 10])
sumAll([10, 5])Expected output:
10
10
45
45Solution
I don't know what you would use
$$\sum_{i=min}^{max} i = \frac{(max-min+1)(min+max)}2$$
We just need to pick out which one is larger:
Or we could generalize to any arithmetic sequence:
I guess if you really want
reduce() for to be honest. But you don't need to loop. We just have a simple arithmetic sequence with a straightforward formula:$$\sum_{i=min}^{max} i = \frac{(max-min+1)(min+max)}2$$
We just need to pick out which one is larger:
function sumFrom(min, max) {
return (max-min+1) * (min+max) / 2;
}
function sumAll(arr) {
return sumFrom(Math.min(...arr), Math.max(...arr));
}Or we could generalize to any arithmetic sequence:
function sumArithmetic(a1, n, d) {
return n*(2*a1 + (n-1)*d) / 2;
}
function sumAll(arr) {
var min = Math.min(...arr);
return sumArithmetic(min, Math.max(...arr) - min + 1, 1);
}I guess if you really want
reduce() you'd do it this way (not using ES6 because I don't know how to get freecodecamp to use it):function sumAll(arr) {
var min = Math.min.apply(null, arr);
var max = Math.max.apply(null, arr);
return Array.apply(null, Array(max-min+1)) // get array of correct size
.map(function(_, b) { return b+min; }) // change it to have correct values
.reduce(function(a, b) { return a+b; }); // and sum it
}Code Snippets
function sumFrom(min, max) {
return (max-min+1) * (min+max) / 2;
}
function sumAll(arr) {
return sumFrom(Math.min(...arr), Math.max(...arr));
}function sumArithmetic(a1, n, d) {
return n*(2*a1 + (n-1)*d) / 2;
}
function sumAll(arr) {
var min = Math.min(...arr);
return sumArithmetic(min, Math.max(...arr) - min + 1, 1);
}function sumAll(arr) {
var min = Math.min.apply(null, arr);
var max = Math.max.apply(null, arr);
return Array.apply(null, Array(max-min+1)) // get array of correct size
.map(function(_, b) { return b+min; }) // change it to have correct values
.reduce(function(a, b) { return a+b; }); // and sum it
}Context
StackExchange Code Review Q#117166, answer score: 20
Revisions (0)
No revisions yet.