From e6e3cfbccc8233d22dc7d99ee59f28b4ba571c2a Mon Sep 17 00:00:00 2001 From: Bill Ewanick Date: Tue, 19 Sep 2023 16:31:12 -0400 Subject: [PATCH] Euler question 14 - start --- .vscode/settings.json | 1 + src/projectEuler/question14.hs | 48 ++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/projectEuler/question14.hs diff --git a/.vscode/settings.json b/.vscode/settings.json index d113012..9700597 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "cSpell.words": [ + "Collatz", "concat", "coprime", "elems", diff --git a/src/projectEuler/question14.hs b/src/projectEuler/question14.hs new file mode 100644 index 0000000..c8a4a8e --- /dev/null +++ b/src/projectEuler/question14.hs @@ -0,0 +1,48 @@ +{- +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. +-} +module Main where + +-- import Data.Set (Set) +-- import qualified Data.Set as Set + +import Data.IntSet (IntSet) +import qualified Data.IntSet as IntSet + +main :: IO () +main = print ans + +ans :: Integer +ans = 42 + +nextCollatz n + | n == 1 = 0 + | even n = n `div` 2 + | odd n = 3*n + 1 + +collatzChainStartingAt n = takeWhile (/= 0) $ iterate nextCollatz n + +-- solve limit = (n, chain) +-- where +-- s = maximum +-- $ map length +-- $ map collatzChainStartingAt [1..limit] +limit = 1_000_000 + +wholePositiveNumbers :: IntSet +wholePositiveNumbers = IntSet.fromDistinctAscList [1..limit] + +f = IntSet.foldl (\acc key -> collatzChainStartingAt key : acc) []