aoc2020/day5.hs
2020-12-05 18:34:15 +13:00

44 lines
1.1 KiB
Haskell

import Data.List (sort)
main :: IO ()
main = do
raw <- readFile "day5.txt"
let valid = foldr (&&) True $ map validate $ lines raw
ls = if valid
then map parse $ lines raw
else error "invalid input"
ansA = maximum ls
ansB = findGap $ sort ls
in do
putStrLn $ "day5a: " ++ (show ansA)
putStrLn $ "day5b: " ++ (show ansB)
validate :: String -> Bool
validate s =
length s == 10
&& all (`elem` ['F', 'B']) (take 7 s)
&& all (`elem` ['L', 'R']) (drop 7 s)
parse :: String -> Int
parse s = row * 8 + column
where
rowString = (take 7 s)
columnString = (drop 7 s)
row = fromBinaryString 'B' rowString
column = fromBinaryString 'R' columnString
fromBinaryString :: Char -> String -> Int
fromBinaryString t s =
foldr (+) 0 $ map snd $ filter (\x -> fst x == t) $ zip (reverse s) powList
findGap :: [Int] -> Int
findGap [] = error "empty list"
findGap [x] = error "short list"
findGap (x:y:xs) =
if y == succ x
then findGap (y:xs)
else succ x
powList :: [Int]
powList = 1 : map (* 2) powList