wvogel日記

自分用の技術備忘録が多めです.

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
解けた解けた!!