Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # defines the list of integers from 'n' downto 0
- def Zi (a, b)
- (a.downto b).lazy
- end
- # the equation numberOfOccurances(smallestMultiple + largestMultiple)/2 gives the sum of all the multiples for a given range
- # so, below, multipleCounts[i](multiples[i] + lastMultiples[i])/2 => multipleCounts[i](lastAndFirstMultipleSums[i])/2
- # gives the arbitrary sum of multiples of a give number in multiples for the specified range.
- def find_sum_for_each_multiple(from, to, *multiples)
- myReverseArr = Zi to, from
- lastMultiples = multiples.map { |m| myReverseArr.find { |i| i%m == 0 } }
- multipleCounts = lastMultiples.zip(multiples).map { |ms| ms.reduce(:/) }
- lastAndFirstMultipleSums = lastMultiples.zip(multiples).map { |ms| ms.reduce(:+) }
- sumsOfEachMultiple = lastAndFirstMultipleSums.zip(multipleCounts).map { |xs| xs.reduce(:*) }.map { |x| x/2 }
- end
- def find_sum_of_multiples(from, to, *multiples)
- sumsOfEachMultiple = find_sum_for_each_multiple(from, to, multiples)
- commonMultiples = []
- (0..(multiples.length - 1)).each do |i|
- ((i+1)..(multiples.length - 1)).each do |j|
- commonMultiples << (multiples[i] * multiples[j])
- end
- end
- sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, commonMultiples)
- totalSum = (sumsOfEachMultiple.inject { |sum, x| sum + x }) - (sumsOfCommonMultiples.inject { |sum, x| sum + x })
- end
- puts find_sum_of_multiples(0, 999, 3, 5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement