44 lines
1.1 KiB
Haskell
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
|