-
-
Save nefarioustim/1008926 to your computer and use it in GitHub Desktop.
// Do the maths | |
for( | |
var sum = 0, i = 1; | |
i < 1000; | |
!(i % 3 && i % 5) && (sum += i), i++ | |
); | |
// Log the result | |
console.log(sum); |
// Prep the array | |
for( | |
var arr = [], i = 1; | |
i < 1000; | |
!(i % 3 && i % 5) && arr.push(i), i++ | |
); | |
// Sum the array | |
console.log( | |
arr.reduce( | |
function(prev, current) { | |
return prev + current | |
} | |
) | |
); |
print sum([i for i in range(1000) if not (i % 3 and i % 5)]) |
puts (1...1000).select{ |n| n % 3 == 0 || n % 5 == 0 }.reduce(:+) |
Or was the point to play with reduce
? :)
Actually, I hadn't thought of it that way because I'd come from doing it in Ruby and Python. :)
Euler Project!
Note the filenames, Carlo. :D
I know, I got overly enthusiastic about it is all.
Since you're already making your for
loop unreadable, you might as well go all-out: stick the postincrement inside the assignment. :)
sum += i++
And what is this Euler Project? Am I doing your homework for you? Have I missed out on opportunities to win huge prizes and fame?
Congratulations, you've given birth to a healthy infinite loop.
And it's not unreadable, it's elegant and lovely.
Unless I’m misreading it, your Python version includes 1000 in the sum while the other versions don’t.
Also, for added goodness, you can omit the square brackets in the list comprehension and it’ll do it as a generator, saving you the massive overhead of storying a 200-item array ;-)
Oh, and my candidate for “Most pedantic code review point ever”:
You don’t need to use range(1, 1000)
: you can just as happily use range(1000)
, because no-one cares if you add zero to your total.
Both highly valid points, Dave. I shall update.
Comments welcome: euler-problem-1.sh
This is as short as I can make it whilst keeping it legible:
var sum=0, i=2;
while(i++,i<1000) { sum += (i % 3 && i % 5) ? 0 : i; }
console.log(sum);
Starting from 2 to save some cycles. Interesting.
Do I need to explain my working?
def sum_under (val, step):
pairs = val / step
return (pairs*((pairs*step)+step)/2)
sum_under (999,3) + sum_under(999,5) - sum_under(999,15)
Nah, that's the algebraic solution to the problem. I remember doing that at school. :D
Actually Dave, can you do it again using only 1000, 3, and 5 as parameters?
Your maths is wrong 'cos whilst 999 is valid for 3, it should be 995 for 5 and… uh… 990 for 15, I believe.
For those that are interested, problem 2 solved with JS here: https://gist.github.com/1009018
(999 / 15) * 15 = 990
(999 / 15.0) * 15 = 998.9999
Integer truncation is my friend
Here is one that solves the sum of multiples of numbers in an array less than a given limit.
Find the codein JS HERE
//test: find the sum of the multiples of 3 and 5 less than 1000
console.log(sumOfMultplesOfNumbersLessThan([3,5], 1000));
sum = 0;
for(i = 1; i<1000;i++){
if((i % 3 === 0) || (i % 5 ===0)){
sum += i;
}
}
newbie rules!
Super useful. thanks for posting this with the different code options.
I think you've made the JS implementation more complicated than it needs to be. How about;