Life Goes On

まあまあだけど楽しんでる方です

61問目

http://projecteuler.net/index.php?section=problems&id=61
8128, 2882, 8281 の3つの数の組合せは以下の特徴を持つ。

  1. それぞれの数の最後の2つの数字が次の数の最初の2つの数字となっており、循環している。
  2. 8128は三角数、2882は四角数、8281は五角数で、異なる数の多角数となっている。
  3. この特徴を持つ4桁の数字の組合せは、これだけである。

同様にそれぞれの数が三角数、四角数、五角数、六角数、七角数、八角数で、かつ循環するような6つの数の組合せについて、その和を求める。
多角数を一つの式で表せたのが、ちょっとうれしい。

import Data.List

main = print $ sum euler061

euler061 :: [Integer]
euler061 = head [ map read (p : post) | p <- oct, post <- search [p] polygonals ]

search :: [String] -> [[String]] -> [[String]]
search ans [] = [ [] | drop 2 (head ans) == take 2 (last ans) ]
search pre pss = [ p : post |
    ps <- pss, p <- ps, drop 2 (head pre) == take 2 p,
    post <- search (p : pre) (delete ps pss) ]

oct :: [String]
oct = p 7

polygonals :: [[String]]
polygonals = [ p n | n <- [2..6] ]

p :: Integer -> [String]
p n = takeWhile ((== 4) . length) $ dropWhile ((< 4) . length) $
    map show $ scanl1 (+) [1,n..]