advent-of-code/hs/src/Aoc/Y2020/D05.hs
2020-12-06 12:29:00 +00:00

43 lines
947 B
Haskell

module Aoc.Y2020.D05
( day
) where
import Control.Monad
import qualified Data.Set as Set
import Aoc.Day
import Aoc.Parse
-- Ordered from least to most significant
fromBin :: [Bool] -> Int
fromBin bs = sum $ zipWith (*) (iterate (*2) 1) (map fromEnum bs)
parser :: Parser [Int]
parser = manyLines $ do
fbs <- count 7 $ (False <$ char 'F') <|> (True <$ char 'B')
lrs <- count 3 $ (False <$ char 'L') <|> (True <$ char 'R')
pure $ fromBin $ reverse $ fbs ++ lrs
allSeats :: [Int]
allSeats = [0..1023]
mySeats :: Set.Set Int -> [Int]
mySeats taken = do
sid <- allSeats
guard $ (sid - 1) `Set.member` taken
guard $ not $ sid `Set.member` taken
guard $ (sid + 1) `Set.member` taken
pure sid
solver :: [Int] -> IO ()
solver ps = do
putStrLn ">> Part 1"
print $ maximum ps
putStrLn ""
putStrLn ">> Part 2"
print $ mySeats $ Set.fromList ps
day :: Day
day = dayParse parser solver