def divisorsum(x)
ret = 1
(2..x).each {|i|
if (i * i > x)
break
end
if (x % i == 0)
ret += i + (x / i)
end
}
return ret
end
amChainLength = Array.new(size = 1000001, obj = 0)
maxCLength = 0
ans = 0
(4..1000000).each {|i|
chain = [i]
nextElem = i
while (nextElem < 1000000 and amChainLength[nextElem] == 0)
nextElem = divisorsum(nextElem)
if (chain.include? nextElem)
atIndex = chain.index(nextElem)
(0..(atIndex - 1)).each{ |ind|
amChainLength[chain[ind]] = 1
}
subl = chain.length - atIndex
minElem = nextElem
(atIndex..(chain.length - 1)).each{ |ind|
amChainLength[chain[ind]] = 1
minElem = [minElem, chain[ind]].min
}
if (subl > maxCLength)
maxCLength = subl
ans = minElem
end
elsif (nextElem > 1000000)
chain.each {|elem| amChainLength[elem] = 1}
end
chain <<= nextElem
end
# If we hit something that made us end prematurely:
if (amChainLength[i] == 0)
chain.each {|elem| amChainLength[elem] = 1}
end
}
printf("%d\n", ans)
Friday, August 1, 2014
Problem 95 - Ruby
After solving problem 56 in Linotte, I freed up Ruby, a language plenty of people have good things to say about but which I have only used in my life for solving the Project Euler problems for this challenge I have used it for. Problem 95 was a pretty fun problem, involving a lot of kind of neat techniques for making sure you find all "amicable chains" and trying to repeat as little computation as possible. Ruby was a pretty solid language for solving this problem, though my solution runs in a not-terribly fast time. I am deciding to be ok with this because I don't think Ruby is really the fastest of languages, and my run time is still within reasonable bounds. I may come back later and fix things up a bit, but for now the below solution works without being too flashy and runs in about 4min on my machine.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment