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.

44 lines
1.1KB

  1. import Data.List (sort)
  2. main :: IO ()
  3. main = do
  4. raw <- readFile "day5.txt"
  5. let valid = foldr (&&) True $ map validate $ lines raw
  6. ls = if valid
  7. then map parse $ lines raw
  8. else error "invalid input"
  9. ansA = maximum ls
  10. ansB = findGap $ sort ls
  11. in do
  12. putStrLn $ "day5a: " ++ (show ansA)
  13. putStrLn $ "day5b: " ++ (show ansB)
  14. validate :: String -> Bool
  15. validate s =
  16. length s == 10
  17. && all (`elem` ['F', 'B']) (take 7 s)
  18. && all (`elem` ['L', 'R']) (drop 7 s)
  19. parse :: String -> Int
  20. parse s = row * 8 + column
  21. where
  22. rowString = (take 7 s)
  23. columnString = (drop 7 s)
  24. row = fromBinaryString 'B' rowString
  25. column = fromBinaryString 'R' columnString
  26. fromBinaryString :: Char -> String -> Int
  27. fromBinaryString t s =
  28. foldr (+) 0 $ map snd $ filter (\x -> fst x == t) $ zip (reverse s) powList
  29. findGap :: [Int] -> Int
  30. findGap [] = error "empty list"
  31. findGap [x] = error "short list"
  32. findGap (x:y:xs) =
  33. if y == succ x
  34. then findGap (y:xs)
  35. else succ x
  36. powList :: [Int]
  37. powList = 1 : map (* 2) powList