Dag 1 :: Haskell
Mycket svårare än något jag sett på dag 1 i tidigare AOCs. Ofta skulle man trivialt kunna göra ettan i Excel, men så var det absolut inte idag. Kanske hade varit lättare om man använt regex, men det är hemskt, så jag vill inte.
part a
main :: IO()
main = do
input <- readFile "inputs/Day1.txt"
print
$ sum
$ map ((read::String->Int) . (\(Just f, Just l ) -> [f,l]) . firstAndLast)
$ lines input
firstAndLast :: String -> (Maybe Char, Maybe Char)
firstAndLast s = (find isDigit s, find isDigit $ reverse s)
part b
main :: IO()
main = do
input <- readFile "inputs/Day1.txt"
print
$ sum
$ map (\line -> findFirst line * 10 + findLast line)
$ lines input
findFirst :: [Char] -> Int
findFirst s = helper 0 s take
findLast :: [Char] -> Int
findLast s = helper 0 s (\li ls -> drop (length ls - li ) ls)
helper :: Num t1 => t1 -> t2 -> (t1 -> t2 -> [Char]) -> Int
helper len s f
| or tests = fromJust (elemIndex True tests ) `mod` 10
| otherwise = helper (len + 1) s f
where tests = [isInfixOf digit $ f len s | digit <- digits]
digits :: [String]
digits = map show [0..9] ++ ["__blank__", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]