[hs] Solve 2020_05

This commit is contained in:
Joscha 2020-12-05 11:27:21 +00:00
parent 5a5ddf586b
commit cc88ab416b
2 changed files with 59 additions and 0 deletions

View file

@ -7,6 +7,7 @@ import qualified Aoc.Y2020.D01 as D01
import qualified Aoc.Y2020.D02 as D02 import qualified Aoc.Y2020.D02 as D02
import qualified Aoc.Y2020.D03 as D03 import qualified Aoc.Y2020.D03 as D03
import qualified Aoc.Y2020.D04 as D04 import qualified Aoc.Y2020.D04 as D04
import qualified Aoc.Y2020.D05 as D05
days :: [Day] days :: [Day]
days = days =
@ -14,4 +15,5 @@ days =
, D02.day , D02.day
, D03.day , D03.day
, D04.day , D04.day
, D05.day
] ]

57
hs/src/Aoc/Y2020/D05.hs Normal file
View file

@ -0,0 +1,57 @@
module Aoc.Y2020.D05
( day
) 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)
parser :: Parser [Pass]
parser = manyLines $ do
fbs <- sequenceA $ replicate 7 $ (False <$ char 'F') <|> (True <$ char 'B')
lrs <- sequenceA $ replicate 3 $ (False <$ char 'L') <|> (True <$ char 'R')
pure Pass { fb = fbs, lr = 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)
cols :: [[Bool]]
cols = sequenceA $ replicate 3 [False, True]
rows :: [[Bool]]
rows = sequenceA $ replicate 7 [False, True]
mySeats :: Set.Set Pass -> [Pass]
mySeats taken = do
col <- cols
(prevRow, row, nextRow) <- zip3 rows (drop 1 rows) (drop 2 rows)
let prevPass = Pass prevRow col
pass = Pass row col
nextPass = Pass nextRow col
guard $ prevPass `Set.member` taken
guard $ not $ pass `Set.member` taken
guard $ nextPass `Set.member` taken
pure pass
solver :: [Pass] -> IO ()
solver ps = do
putStrLn ">> Part 1"
print $ maximum $ map seatId ps
putStrLn ""
putStrLn ">> Part 2"
let taken = Set.fromList ps
print $ map seatId $ mySeats taken
day :: Day
day = dayParse "2020_05" parser solver