Euler question 14 - start
parent
970c584d0a
commit
e6e3cfbccc
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
"cSpell.words": [
|
||||
"Collatz",
|
||||
"concat",
|
||||
"coprime",
|
||||
"elems",
|
||||
|
|
|
@ -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) []
|
Loading…
Reference in New Issue