61問目
http://projecteuler.net/index.php?section=problems&id=61
8128, 2882, 8281 の3つの数の組合せは以下の特徴を持つ。
- それぞれの数の最後の2つの数字が次の数の最初の2つの数字となっており、循環している。
- 8128は三角数、2882は四角数、8281は五角数で、異なる数の多角数となっている。
- この特徴を持つ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..]