Project Euler 42(2)
我ながらあほらしい。
どうしてこんなことに気がつかなかったんだ.....
昨日メモリリークしたのは、単純に無限リストを使っているからです。
euler42 :: String -> Int euler42 str = case (wordnum str `elem`) trinumbers of True -> 1 False -> 0
とありますが、trinumbersが無限リストなので、elemはどこまでもどこまでもリストを読み込んでいきます。
結果、落ちたんです
どうしてこんなことに気がつかなかった、自分......
なので、書き直した。
というか、書き加えた。変更のあった部分のみ
import Data.Char import Data.Maybe euler42 :: String -> Int euler42 str = case wordvalue str `check42` trinumbers of True -> 1 False -> 0 check42 :: Int -> [Int]->Bool check42 n (x:xs) | n < x = False | n == x = True |otherwise = check42 n xs main =do fs <- readFile "word.txt" print $ sum $ map euler42$ lines fs
結果、161と返って来ました。
多分あっているんでしょう。
check42関数はなくても大丈夫。
その場合は
euler42 str = case wordvalue str `elem` (takeWhile (<=wordvalue str) trinumbers) of
とした。
どちらにしても結果は161
解けた解けた!!