import Data.List import Data.Char -- isDigit :: Char -> Bool -- isDigit c = c >= '0' && c <= '9' wordDict = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"] findFirst :: String -> [String] -> Int findFirst [] _ = 0 findFirst s@(x:xs) wordDict | isDigit x = read [x] | Just y <- elemIndex (take 3 s) wordDict = y | Just y <- elemIndex (take 4 s) wordDict = y | Just y <- elemIndex (take 5 s) wordDict = y | otherwise = findFirst xs wordDict rev [] = [] rev (x:xs) = rev xs ++ [x] main :: IO () main = do inputLines <- lines <$> getContents let filterLines = map (filter isDigit) inputLines let outerChars = map (\x -> [head x, last x]) filterLines mapM_ putStrLn outerChars let intList = map read outerChars :: [Int] -- let intList = map (\x -> findFirst x wordDict * 10 + findFirst (rev x) (map rev wordDict)) inputLines let result = sum intList putStrLn $ show result