import Data.List (sort, subsequences) main :: IO () main = do raw <- readFile "day10.txt" let nums = (map read $ lines raw) :: [Int] ansA = solveA nums ansB = solveB nums in do putStrLn $ "day10a: " ++ (show ansA) putStrLn $ "day10b: " ++ (show ansB) solveA :: [Int] -> Int solveA nums = (filt 3 ls) * (filt 1 ls) where filt a = length . (filter (== a)) end = 3 + (maximum nums) ls = (diffs . sort) (0 : end : nums) solveB :: [Int] -> Int solveB nums = unLookup 0 $ loeb $ map (loebify ls m) ls where unLookup a ns = unMaybe $ lookup a ns ls = sort $ 0 : ((maximum nums) + 3) : nums m = (maximum nums + 3) diffs :: [Int] -> [Int] diffs [] = [] diffs [a] = [] diffs (a:b:xs) = (b-a):(diffs (b:xs)) loeb :: Functor f => f (f a -> a) -> f a loeb x = go where go = fmap ($ go) x loebify :: [Int] -> Int -> Int -> [(Int, Int)] -> (Int, Int) loebify nums m t = if t == m then (\ls -> (t, 1)) else (\ls -> (t, sum [ f ls | f <- links ])) where vals = takeWhile (<= (t + 3)) $ dropWhile (<= t) nums links = map lookupify vals lookupify :: Eq a => a -> [(a,b)] -> b lookupify k = unMaybe . (lookup k) unMaybe :: Maybe a -> a unMaybe Nothing = error "invalid key" unMaybe (Just v) = v