Project Euler 42
さてさて。
今日も今日とてeuler
なかなかうまくいきませんね。
とりあえず、ソースコード
import Control.Monad import Data.Char import Data.Maybe alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" table = zip alphabets [1..] trinumbers = map trifunc [1..] euler42 :: String -> Int euler42 str = case (wordnum str `elem`) trinumbers of True -> 1 False -> 0 trifunc :: Int ->Int trifunc n = n*(n+1) `div` 2 wordnum :: [Char] ->Int wordnum [] = 0 wordnum (s:str) =(fromJust $ lookup (toUpper s) table) + wordnum str main =do fs <- readFile "word.txt" forM_ (map (show. euler42) $ lines fs) (writeFile "sum.txt")
なお、eulerにあったテキストファイルはそのままでは読み込んだ後処理を加えなければいけなかったので、事前に別ファイルに整形して出力しておいた。
そのとき使用したもの↓
import System.IO main = do fs <- readFile "words.txt" writeFile "word.txt" $words' fs words' :: String ->String words' [] = "\n" words' (x:xs) = case x of '\"' -> words' xs ',' -> '\n':words' xs otherwise -> x:words' xs
ところがね。
これもやはりメモリオーバ。
何がいけなかったのか考えるときに今回の場合二つあると思うのです
一つはファイルの読み書き時にオーバーしている?
でも、二つ目のソースコードによる、テキストファイルの整形は一瞬で終わったことを考えるとそうではなさそう
そもそもHaskellのファイル処理は、遅延されるので、文字読み込みによるバッファ溢れはない........はず。
上のプログラム、今気づきましたが、hGetContents や hCloseを使ってませんね。
おそらくこれはやっぱり数値処理に関するものでしょうか
上のコードでは、とりあえずsum.txtに内容を出力して様子を見ようとしたときのものです。
が、メモリ溢れ時にファイルを閉じていないため、内容が更新されません。
プログラム自体は、skyといれればちゃんと三角数としてカウントされます。
ので、その周辺を改善しなければならないよう
うーん