23 lines
1002 B
Haskell
23 lines
1002 B
Haskell
-- Using p022_names.txt, a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order.
|
||
-- Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.
|
||
--
|
||
-- For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list.
|
||
-- So, COLIN would obtain a score of 938 × 53 = 49714.
|
||
--
|
||
-- What is the total of all the name scores in the file?
|
||
|
||
import Data.Char (ord)
|
||
import Data.List (sort)
|
||
import Data.List.Split (splitOn)
|
||
|
||
nameScore :: String -> Int
|
||
nameScore s = let a = ord 'A' - 1
|
||
in sum $ map ((\x -> x - a) . ord) s
|
||
|
||
main = do
|
||
contents <- readFile "p022_names.txt"
|
||
let name_scores = map nameScore . sort . splitOn "," $ filter (/= '"') contents
|
||
result = sum $ zipWith (*) name_scores [1..]
|
||
putStrLn $ "Project Euler, Problem 22\n"
|
||
++ "Answer: " ++ show result
|