diff --git a/sum-of-multiples/example.py b/sum-of-multiples/example.py index cd993c6407..b5ab33145b 100644 --- a/sum-of-multiples/example.py +++ b/sum-of-multiples/example.py @@ -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)) diff --git a/sum-of-multiples/sum_of_multiples_test.py b/sum-of-multiples/sum_of_multiples_test.py index e507f5e721..ebe124ec7a 100644 --- a/sum-of-multiples/sum_of_multiples_test.py +++ b/sum-of-multiples/sum_of_multiples_test.py @@ -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__':