Skip to content

Commit

Permalink
Merge pull request #149 from sjakobi/fix-sum-of-multiples
Browse files Browse the repository at this point in the history
sum-of-multiples: Move to functional solution, add tests
  • Loading branch information
kytrinyx committed Nov 24, 2014
2 parents 2bc8442 + 43e30cd commit 3f80959
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 20 deletions.
22 changes: 9 additions & 13 deletions sum-of-multiples/example.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
class SumOfMultiples(object):

def __init__(self, *args):
self.numbers = args if args else [3, 5]

def to(self, limit):
return sum(n
for n in range(limit)
if self.is_multiple(n))

def is_multiple(self, m):
return any(m % n == 0
for n in self.numbers)
def sum_of_multiples(limit, multiples=None):
if multiples is None:
multiples = [3, 5]
elif multiples[0] == 0:
# multiples of 0 don't change the sum
multiples = multiples[1:]
return sum(value for value in range(limit)
if any(value % multiple == 0
for multiple in multiples))
30 changes: 23 additions & 7 deletions sum-of-multiples/sum_of_multiples_test.py
Original file line number Diff line number Diff line change
@@ -1,26 +1,42 @@
"""
You can make the following assumptions about the inputs to the
'sum_of_multiples' function:
* All input numbers are non-negative 'int's, i.e. natural numbers including
zero.
* If a list of factors is given, its elements are uniqe and sorted in
ascending order.
* If the 'factors' argument is missing, use the list [3, 5] instead.
"""

import unittest

from sum_of_multiples import SumOfMultiples
from sum_of_multiples import sum_of_multiples


class SumOfMultiplesTest(unittest.TestCase):
def test_sum_to_1(self):
self.assertEqual(0, SumOfMultiples().to(1))
self.assertEqual(0, sum_of_multiples(1))

def test_sum_to_3(self):
self.assertEqual(3, SumOfMultiples().to(4))
self.assertEqual(3, sum_of_multiples(4))

def test_sum_to_10(self):
self.assertEqual(23, SumOfMultiples().to(10))
self.assertEqual(23, sum_of_multiples(10))

def test_sum_to_1000(self):
self.assertEqual(233168, SumOfMultiples().to(1000))
self.assertEqual(233168, sum_of_multiples(1000))

def test_configurable_7_13_17_to_20(self):
self.assertEqual(51, SumOfMultiples(7, 13, 17).to(20))
self.assertEqual(51, sum_of_multiples(20, [7, 13, 17]))

def test_configurable_43_47_to_10000(self):
self.assertEqual(2203160, SumOfMultiples(43, 47).to(10000))
self.assertEqual(2203160, sum_of_multiples(10000, [43, 47]))

def test_configurable_0_to_10(self):
self.assertEqual(0, sum_of_multiples(10, [0]))

def test_configurable_0_1_to_10(self):
self.assertEqual(45, sum_of_multiples(10, [0, 1]))


if __name__ == '__main__':
Expand Down

0 comments on commit 3f80959

Please sign in to comment.