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])