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