1
0
Fork 0
projecteuler/61.hs

47 lines
1.6 KiB
Haskell

tri = [round $ n * (n + 1) / 2 | n <- [45..140]]
sqr = [round $ n * n | n <- [32..100]]
pnt = [round $ n * (3 * n - 1) / 2 | n <- [26..81]]
hex = [round $ n * (2 * n - 1) | n <- [23..70]]
hep = [round $ n * (5 * n - 3) / 2 | n <- [21..63]]
oct = [round $ n * (3 * n - 2) | n <- [19..58]]
tip :: Int -> String
tip n = take 2 $ show n
end :: Int -> String
end n = drop 2 $ show n
isCyclic :: Int -> Int -> Bool
isCyclic x y = end x == tip y
poly = [tri, sqr, pnt, hex, hep]
cyclics = [(a, b, c, d, e, f) | a <- oct,
i <- [0..4],
b <- poly !! i,
isCyclic a b,
j <- [0..4],
j /= i,
c <- poly !! j,
isCyclic b c,
k <- [0..4],
all (k /=) [i, j],
d <- poly !! k,
isCyclic c d,
l <- [0..4],
all (l /=) [i, j, k],
e <- poly !! l,
isCyclic d e,
m <- [0..4],
all (m /=) [i, j, k, l],
f <- poly !! m,
isCyclic e f,
isCyclic f a]
main = do print $ head cyclics
print $ let (a, b, c, d, e, f) = head cyclics
in a + b + c + d + e + f