From 907a73b0bee92d5b7f897f172e125d785471e5ed Mon Sep 17 00:00:00 2001 From: daviddoji Date: Sat, 24 Jul 2021 10:17:43 +0200 Subject: [PATCH] Solution to problem 14 in Julia --- src/Julia/Problem014.jl | 68 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 src/Julia/Problem014.jl diff --git a/src/Julia/Problem014.jl b/src/Julia/Problem014.jl new file mode 100644 index 0000000..ae71e2a --- /dev/null +++ b/src/Julia/Problem014.jl @@ -0,0 +1,68 @@ +#= +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 + if haskey(terms, n) + length += terms[n] + break + end + if n % 2 == 0 + n = n / 2 + else + n = 3n + 1 + end + 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 + terms = Dict() + for i in 1:limit + terms[i] = chain_length(i, terms) + if terms[i] > score + score = terms[i] + ans = i + end + end + return ans +end + + +println("Time to evaluate Problem 14:") +@time Problem14() +println("") +println("Result for Problem 14: ", Problem14())