28 lines
1.1 KiB
Haskell
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
|