Problem44が解けた?

30分プログラム、その318。Problem44 - Project Eulerが解けた、のか? id:banjunのコードをリライトしただけがしないでもない。
方針としては、適当なxとjを選ぶ(x<j)。で、x+jとx+j+jが五角数であるかを確認する。ただ、xを選んだときのjの上限の選び方がよく分からない。
まあ、いいや。次に進もう。

使い方

$ ./problem44
1
5
12
22
...
5482660

ソースコード

import Control.Monad.List
import Debug.Trace
penta :: [Int]
penta = [n*(3*n-1) `div` 2 | n <- [1..]]


inPenta :: Int -> Bool
inPenta x = let d = sqrt (1 + 24 * (fromInteger $toInteger x))
            in isInt d && (floor d) `mod` 6 == 5
    where isInt x = ceiling x == floor x

-- j - k = x 
-- j + k = y
-------
-- k = j - x
-- x > j > k
solve  = do x <- penta
            j <- take (magic (trace (show x) x)) penta
            guard $ j > x
            let k = j - x
            guard $ j > k
            let y = j + k
            guard $ inPenta k
            guard $ inPenta y
            return x
    where magic x = (x - 1) `div` 3 -- 謎の関数

main = print $ head solve