[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
import Control.Monad
import qualified Data.Set as Set
import Aoc.Day
import Aoc.Parse
data Pass = Pass
{ fb :: [Bool]
, lr :: [Bool]
} deriving (Show, Eq, Ord)
-- Ordered from least to most significant
fromBin :: [Bool] -> Int
fromBin bs = sum $ zipWith (*) (iterate (*2) 1) (map fromEnum bs)
parser :: Parser [Pass]
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 Pass { fb = fbs, lr = lrs }
pure $ fromBin $ reverse $ fbs ++ lrs
calcNum :: [Bool] -> Int
calcNum bs = sum $ zipWith (*) (iterate (*2) 1) (map fromEnum $ reverse bs)
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])
allSeats :: [Int]
allSeats = [0..1023]
mySeats :: Set.Set Int -> [Int]
mySeats taken = do
sid <- seatId <$> allSeats
sid <- allSeats
guard $ (sid - 1) `Set.member` taken
guard $ not $ sid `Set.member` taken
guard $ (sid + 1) `Set.member` taken
pure sid
solver :: [Pass] -> IO ()
solver :: [Int] -> IO ()
solver ps = do
putStrLn ">> Part 1"
print $ maximum $ map seatId ps
print $ maximum ps
putStrLn ""
putStrLn ">> Part 2"
let taken = Set.fromList $ map seatId ps
print $ mySeats taken
print $ mySeats $ Set.fromList ps
day :: Day
day = dayParse "2020_05" parser solver