[hs] Clean up 2020_05 even more

This commit is contained in:
Joscha 2020-12-05 12:15:19 +00:00
parent aa7658e17f
commit eb8a9795ed

View file

@ -3,50 +3,41 @@ module Aoc.Y2020.D05
) where ) where
import Control.Monad import Control.Monad
import qualified Data.Set as Set import qualified Data.Set as Set
import Aoc.Day import Aoc.Day
import Aoc.Parse import Aoc.Parse
data Pass = Pass -- Ordered from least to most significant
{ fb :: [Bool] fromBin :: [Bool] -> Int
, lr :: [Bool] fromBin bs = sum $ zipWith (*) (iterate (*2) 1) (map fromEnum bs)
} deriving (Show, Eq, Ord)
parser :: Parser [Pass] parser :: Parser [Int]
parser = manyLines $ do parser = manyLines $ do
fbs <- count 7 $ (False <$ char 'F') <|> (True <$ char 'B') fbs <- count 7 $ (False <$ char 'F') <|> (True <$ char 'B')
lrs <- count 3 $ (False <$ char 'L') <|> (True <$ char 'R') lrs <- count 3 $ (False <$ char 'L') <|> (True <$ char 'R')
pure Pass { fb = fbs, lr = lrs } pure $ fromBin $ reverse $ fbs ++ lrs
calcNum :: [Bool] -> Int allSeats :: [Int]
calcNum bs = sum $ zipWith (*) (iterate (*2) 1) (map fromEnum $ reverse bs) allSeats = [0..1023]
seatId :: Pass -> Int
seatId p = 8 * calcNum (fb p) + calcNum (lr p)
allSeats :: [Pass]
allSeats = Pass
<$> sequenceA (replicate 7 [False, True])
<*> sequenceA (replicate 3 [False, True])
mySeats :: Set.Set Int -> [Int] mySeats :: Set.Set Int -> [Int]
mySeats taken = do mySeats taken = do
sid <- seatId <$> allSeats sid <- allSeats
guard $ (sid - 1) `Set.member` taken guard $ (sid - 1) `Set.member` taken
guard $ not $ sid `Set.member` taken guard $ not $ sid `Set.member` taken
guard $ (sid + 1) `Set.member` taken guard $ (sid + 1) `Set.member` taken
pure sid pure sid
solver :: [Pass] -> IO () solver :: [Int] -> IO ()
solver ps = do solver ps = do
putStrLn ">> Part 1" putStrLn ">> Part 1"
print $ maximum $ map seatId ps print $ maximum ps
putStrLn "" putStrLn ""
putStrLn ">> Part 2" putStrLn ">> Part 2"
let taken = Set.fromList $ map seatId ps print $ mySeats $ Set.fromList ps
print $ mySeats taken
day :: Day day :: Day
day = dayParse "2020_05" parser solver day = dayParse "2020_05" parser solver