euler/Problem042.hs

28 lines
1.1 KiB
Haskell

-- The nth term of the sequence of triangle numbers is given by, t[n] = ½n(n+1);
-- so the first ten triangle numbers are:
--
-- 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
--
-- By converting each letter in a word to a number corresponding to its
-- alphabetical position and adding these values we form a word value. For
-- example, the word value for SKY is 19 + 11 + 25 = 55 = t[10]. If the word
-- value is a triangle number then we shall call the word a triangle word.
--
-- Using words.txt, a 16K text file containing nearly two-thousand common
-- English words, how many are triangle words?
import Euler
import System.IO
uncomma :: String -> [String]
uncomma = filter ((/= ',') . head) . groupBy (\a b -> (a == ',') == (b == ','))
wordValue :: [Char] -> Int
wordValue = sum . map (\c -> 1 + (fromEnum c - fromEnum 'A'))
isTriangle n = let m = floor (sqrt $ fromIntegral $ 2 * n) in m * (m + 1) == 2 * n
main = do
words <- sort . uncomma . filter (not . (`elem` "\"\r\n")) <$> readFile "p042_words.txt"
print $ length $ filter isTriangle $ map wordValue words