60 lines
1.4 KiB
Julia
60 lines
1.4 KiB
Julia
#=
|
|
Created on 24 Jul 2021
|
|
|
|
@author: David Doblas Jiménez
|
|
@email: daviddoji@pm.me
|
|
|
|
Solution for Problem 14 of Project Euler
|
|
https://projecteuler.net/problem=14
|
|
=#
|
|
|
|
function chain_length(n)#, terms)
|
|
length = 0
|
|
while n > 1
|
|
n = iseven(n) ? n >> 1 : 3n + 1
|
|
length += 1
|
|
end
|
|
return length
|
|
end
|
|
|
|
function Problem14()
|
|
#=
|
|
The following iterative sequence is defined for the set of positive
|
|
integers:
|
|
|
|
n → n/2 (n is even)
|
|
n → 3n + 1 (n is odd)
|
|
|
|
Using the rule above and starting with 13, we generate the following
|
|
sequence:
|
|
|
|
13 → 40 → 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1
|
|
|
|
It can be seen that this sequence (starting at 13 and finishing at 1)
|
|
contains 10 terms. Although it has not been proved yet (Collatz Problem),
|
|
it is thought that all starting numbers finish at 1.
|
|
|
|
Which starting number, under one million, produces the longest chain?
|
|
|
|
NOTE: Once the chain starts the terms are allowed to go above one million.
|
|
=#
|
|
|
|
ans = 0
|
|
limit = 1_000_000
|
|
score = 0
|
|
for i in 1:2:limit # no need to check even numbers
|
|
longest = chain_length(i)
|
|
if longest > score
|
|
score = longest
|
|
ans = i
|
|
end
|
|
end
|
|
return ans
|
|
end
|
|
|
|
|
|
println("Time to evaluate Problem 14:")
|
|
@time Problem14()
|
|
println("")
|
|
println("Result for Problem 14: ", Problem14())
|