From eb8a9795edbd030bd872e3592a0d2eb434cc5ad9 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sat, 5 Dec 2020 12:15:19 +0000 Subject: [PATCH] [hs] Clean up 2020_05 even more --- hs/src/Aoc/Y2020/D05.hs | 33 ++++++++++++--------------------- 1 file changed, 12 insertions(+), 21 deletions(-) diff --git a/hs/src/Aoc/Y2020/D05.hs b/hs/src/Aoc/Y2020/D05.hs index 8560e2d..e3924c2 100644 --- a/hs/src/Aoc/Y2020/D05.hs +++ b/hs/src/Aoc/Y2020/D05.hs @@ -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