You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

52 lines
1.2KB

  1. import Data.List (sort, subsequences)
  2. main :: IO ()
  3. main = do
  4. raw <- readFile "day10.txt"
  5. let nums = (map read $ lines raw) :: [Int]
  6. ansA = solveA nums
  7. ansB = solveB nums
  8. in do
  9. putStrLn $ "day10a: " ++ (show ansA)
  10. putStrLn $ "day10b: " ++ (show ansB)
  11. solveA :: [Int] -> Int
  12. solveA nums = (filt 3 ls) * (filt 1 ls)
  13. where
  14. filt a = length . (filter (== a))
  15. end = 3 + (maximum nums)
  16. ls = (diffs . sort) (0 : end : nums)
  17. solveB :: [Int] -> Int
  18. solveB nums = unLookup 0 $ loeb $ map (loebify ls m) ls
  19. where
  20. unLookup a ns = unMaybe $ lookup a ns
  21. ls = sort $ 0 : ((maximum nums) + 3) : nums
  22. m = (maximum nums + 3)
  23. diffs :: [Int] -> [Int]
  24. diffs [] = []
  25. diffs [a] = []
  26. diffs (a:b:xs) = (b-a):(diffs (b:xs))
  27. loeb :: Functor f => f (f a -> a) -> f a
  28. loeb x = go
  29. where
  30. go = fmap ($ go) x
  31. loebify :: [Int] -> Int -> Int -> [(Int, Int)] -> (Int, Int)
  32. loebify nums m t =
  33. if t == m
  34. then (\ls -> (t, 1))
  35. else (\ls -> (t, sum [ f ls | f <- links ]))
  36. where
  37. vals = takeWhile (<= (t + 3)) $ dropWhile (<= t) nums
  38. links = map lookupify vals
  39. lookupify :: Eq a => a -> [(a,b)] -> b
  40. lookupify k = unMaybe . (lookup k)
  41. unMaybe :: Maybe a -> a
  42. unMaybe Nothing = error "invalid key"
  43. unMaybe (Just v) = v