wvogel日記

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

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といれればちゃんと三角数としてカウントされます。
ので、その周辺を改善しなければならないよう


うーん