Problem44 - Haskellで無理矢理
30分プログラム、その317。Problem44 - Project EulerをHaskellで無理矢理解こうとして失敗した。まあ、無理だとは思ってたけどね。
使った方針は、次のようなもの。
- 適当なPxを決める
- Px = Pi + Pjとなるiとjを全て求める。ただしi > j
- Pi - Pjが五角数のものだけを取り出す
あと、unsafePerformIOとかを使ってログを出そうとしたけれど、うまくいかなかった。たぶん、http://haskell.g.hatena.ne.jp/jmk/20070706/1183688102にあるようなことが原因だろう。
使い方
*Main> solve C-c C-cInterrupted.
ソースコード
import Control.Monad.List import Debug.Trace ps :: [Int] ps = map (\n->n*(3*n-1) `div` 2) [1..] expressed :: Int -> [(Int,Int)] expressed x = do i <- takeWhile (<x) ps j <- takeWhile (<i) ps guard $ x == i + j return (i,j) solve :: [Int] solve = do y <- ps (i,j) <- expressed y guard $ (i-j) `elem` takeWhile (<i-j) ps return (i-j)