三角数の第n項は1/2n(n+1)で求まる。したがって、三角数の最初の10項は次のようになる。1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
単語に含まれる文字をそのアルファベットの位置に応じて数値に変化して足し たものをその単語の値とする。例えば、SKYの単語の値は19 + 11 + 25 = 55で あり、三角数の第10項である。単語の値が三角数であるものを三角語と呼ぶこ とにする。
words.txtに含まれている約2000個の単語の中で三角語の数を求めよ。
words.txtの内容はダブルクオートされた単語のリストであるが、最初と最後に []を付け加えるとHaskellで容易に読み込めるので、問題22と同様にエディタで 編集を行うことにする。ここではデータファイルの名前をeuler042.datとする。
問題22と同様の関数scoreで単語の数値を計算し、それが三角数のリストに含ま れているかどうかで判別して数を求める。三角数としては問題12で定義した trianglesと使う。単語の値は1文字あたり最大でも26なので、三角数のリスト としては1000より小さい範囲で判別する。
euler042 = do x <- readFile "euler042.dat"
return $ length $ filter isTriangle $ map score $ read x
where score s = sum $ map (\x -> ord x - 64) s
isTriangle n = elem n $ takeWhile (< 1000) triangles
