# 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
# What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
# Brute force: can check by 20 then downward from 20 for divisible / This takes a long time
# Trick: the next multiplier is always a multiple of the prior multiplier
require "benchmark"
def smallestDivisibleValue(num) # num is the amount of results to generate
resultArray = [1] # the first value is a given and preset
index = 0 # index of the first array element
multiplier = 1 # initialize the multiplier, used to determine the currentTestValue until value is found
count = 2 # identifies the current position to be evaluated (starts off checking for the 2nd value)
found = false # used to check whether a correct value is found
while (true)
currentTestValue = resultArray[index] * multiplier # currentTestValue is a multiple of the prior result
(1..count).to_a.reverse.each do |i|
if(currentTestValue % i === 0) # currentTestValue must be evenly divisible by all 'i' values to be 'found'
found = true
else
found = false
break # exit the loop in the event that the currentTestValue is not divisble
end
end
multiplier += 1 # increment the multiplier by 1
if found === true
resultArray.push(currentTestValue)
multiplier = 1 # reset the multiplier back to 1, needs to happen after multiplier increment (prevent pre-increment)
index += 1 # increment the index
count += 1
end
return resultArray if resultArray.length === num # saves the result into an array and returns the array when length is equal to user input number
end
end
time = Benchmark.realtime do
puts smallestDivisibleValue(20)[19] # the 19th index value is the 20th element in the area, thus the answer
end
puts "Time elasped #{time*1000} milliseconds"
# output:
# 232792560
# Time elasped 0.316 milliseconds