The first problem within Project Euler isn’t meant to twist the brain in knots and is a gentle introduction to what is coming further down the road. The problem states:
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.
As I mentioned in my initial post about exploring Project Euler, I noted that I often write in a lowest common denominator with whatever language I’m using at the time. The net effect of that decision is often a working but poorly optimised solution or a solution that doesn’t fit well with the spirit of the programming language.
The solution to problem #1 took three distinct evolutions, the first of which is below and looks like a solution you’d likely see in any programming language:
i = 1 sum = 0 while i < 1000: if i % 3 == 0 or i % 5 == 0: sum += i i += 1 print sum
I wasn’t a fan of needing to declare the variables to start with for such a simple problem, so removed the need for the
i but using the Python
range function to generate a series of numbers. The
range function allows you to generate any length series of numbers, starting and ending where you want with any stepping. By default, it starts at 0 and a stepping of 1 – which means
range(1000) is going to generate a list of numbers from 0 – 999.
sum = 0 for x in range(1000): if x % 3 == 0 or x % 5 == 0: sum += x print sum
Python provides functionality for its lists called list comprehensions. The idea behind a list comprehension is that you can perform the same action, whatever that may be, against each item in the set. In the final solution below, I have applied a filter (the
if statements), which now only returns those items from the
for x in range that match and I’m not applying an expression to the resulting matches (the solitary
x before the
for). Once collected the new list is passed to the
sum function to yield our result.
sum([x for x in range(1000) if x % 3 == 0 or x % 5 == 0])