1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
-- 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
|