-- Pentagon numbers -- Problem 44 -- -- Pentagonal numbers are generated by the formula, Pn=n(3nāˆ’1)/2. -- The first ten pentagonal numbers are: -- -- 1, 5, 12, 22, 35, 51, 70, 92, 117, 145, ... -- -- It can be seen that P4 + P7 = 22 + 70 = 92 = P8. However, their difference, -- 70 āˆ’ 22 = 48, is not pentagonal. -- -- Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference -- are pentagonal and D = |Pk āˆ’ Pj| is minimised; what is the value of D? import Data.Maybe(isJust, fromJust) main = do print(fromJust $ last $ takeUntil isJust [diffPentagonal p | p <- pentagonals]) pentagonals = [(3 * n ^ 2 - n) `div` 2 | n <- [1..]] diffPentagonal :: Int -> Maybe Int diffPentagonal n | length testBellow == 0 = Nothing | otherwise = Just $ head testBellow where testBellow = [k - (n - k) | k <- takeWhile (< n) pentagonals, isPentagonal (n - k), isPentagonal (k - (n - k))] isPentagonal :: Int -> Bool isPentagonal x = fromInteger (round n) == n where n = (sqrt (fromIntegral (24 * x + 1)) + 1) / 6 takeUntil :: (a -> Bool) -> [a] -> [a] takeUntil f (x : xs) | f x = [x] | otherwise = x : takeUntil f xs