Advertisement
Guest User

Euler problem 1 - Generic Solution

a guest
Aug 12th, 2013
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 1.42 KB | None | 0 0
  1. # defines the list of integers from 'n' downto 0
  2. def Zi (a, b)
  3.    (a.downto b).lazy
  4. end
  5.  
  6. # the equation numberOfOccurances(smallestMultiple + largestMultiple)/2 gives the sum of all the multiples for a given range
  7. # so, below, multipleCounts[i](multiples[i] + lastMultiples[i])/2 => multipleCounts[i](lastAndFirstMultipleSums[i])/2
  8. # gives the arbitrary sum of multiples of a give number in multiples for the specified range.
  9. def find_sum_for_each_multiple(from, to, *multiples)
  10.    myReverseArr = Zi to, from
  11.    lastMultiples = multiples.map { |m| myReverseArr.find { |i| i%m == 0 } }
  12.    multipleCounts = lastMultiples.zip(multiples).map { |ms| ms.reduce(:/) }
  13.    lastAndFirstMultipleSums = lastMultiples.zip(multiples).map { |ms| ms.reduce(:+) }
  14.    sumsOfEachMultiple = lastAndFirstMultipleSums.zip(multipleCounts).map { |xs| xs.reduce(:*) }.map { |x| x/2 }
  15. end
  16.  
  17. def find_sum_of_multiples(from, to, *multiples)
  18.    sumsOfEachMultiple = find_sum_for_each_multiple(from, to, multiples)
  19.  
  20.    commonMultiples = []
  21.    (0..(multiples.length - 1)).each do |i|
  22.       ((i+1)..(multiples.length - 1)).each do |j|
  23.          commonMultiples << (multiples[i] * multiples[j])
  24.       end
  25.    end
  26.  
  27.    sumsOfCommonMultiples = find_sum_for_each_multiple(from, to, commonMultiples)
  28.  
  29.    totalSum = (sumsOfEachMultiple.inject { |sum, x| sum + x }) - (sumsOfCommonMultiples.inject { |sum, x| sum + x })
  30. end
  31.  
  32. puts find_sum_of_multiples(0, 999, 3, 5)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement