テキストファイルに含まれる5000個以上の名前をアルファベット順にソートし て、その位置と文字から計算した値の積がその名前の得点とする。
例えばCOLINは3+15+12+9+14=53で、938番目に位置するので 938×53=49714が得点となる。
ファイルに含まれる全ての名前の得点の和を求めよ。
与えられたデータファイルはダブルコーテーションでくくられた名前をカンマ で区切ったものであるが、その最初と最後に[]を追加するとHaskellからread関 数で読み込めて便利なので、ここではデータファイルをエディタ等で書き換え ることとする。書き換えたファイルのファイル名はeuler022.datとする。
まずはファイルをreadFileで読み込み、それをreadでStringの配列に変換する。 次にsort関数でソートし、その結果に対してscore関数をmapして文字列の得点 を計算する。得点の計算にはord関数を用いて文字を数値に変換し、Aが1になる ように64を引いている。1から始まる自然数の数列を順番としてzipWithでかけ て和を計算すると解が求まる。
euler022 = do x <- readFile "euler022.dat"
return $ sum $ zipWith (*) (map score (sort $ read x)) [1..]
where score s = sum $ map (\x -> ord x - 64) s
