[hs] Clean up 2020_05

This commit is contained in:
Joscha 2020-12-05 12:09:55 +00:00
parent cc88ab416b
commit aa7658e17f

View file

@ -15,8 +15,8 @@ data Pass = Pass
parser :: Parser [Pass] parser :: Parser [Pass]
parser = manyLines $ do parser = manyLines $ do
fbs <- sequenceA $ replicate 7 $ (False <$ char 'F') <|> (True <$ char 'B') fbs <- count 7 $ (False <$ char 'F') <|> (True <$ char 'B')
lrs <- sequenceA $ replicate 3 $ (False <$ char 'L') <|> (True <$ char 'R') lrs <- count 3 $ (False <$ char 'L') <|> (True <$ char 'R')
pure Pass { fb = fbs, lr = lrs } pure Pass { fb = fbs, lr = lrs }
calcNum :: [Bool] -> Int calcNum :: [Bool] -> Int
@ -25,23 +25,18 @@ calcNum bs = sum $ zipWith (*) (iterate (*2) 1) (map fromEnum $ reverse bs)
seatId :: Pass -> Int seatId :: Pass -> Int
seatId p = 8 * calcNum (fb p) + calcNum (lr p) seatId p = 8 * calcNum (fb p) + calcNum (lr p)
cols :: [[Bool]] allSeats :: [Pass]
cols = sequenceA $ replicate 3 [False, True] allSeats = Pass
<$> sequenceA (replicate 7 [False, True])
<*> sequenceA (replicate 3 [False, True])
rows :: [[Bool]] mySeats :: Set.Set Int -> [Int]
rows = sequenceA $ replicate 7 [False, True]
mySeats :: Set.Set Pass -> [Pass]
mySeats taken = do mySeats taken = do
col <- cols sid <- seatId <$> allSeats
(prevRow, row, nextRow) <- zip3 rows (drop 1 rows) (drop 2 rows) guard $ (sid - 1) `Set.member` taken
let prevPass = Pass prevRow col guard $ not $ sid `Set.member` taken
pass = Pass row col guard $ (sid + 1) `Set.member` taken
nextPass = Pass nextRow col pure sid
guard $ prevPass `Set.member` taken
guard $ not $ pass `Set.member` taken
guard $ nextPass `Set.member` taken
pure pass
solver :: [Pass] -> IO () solver :: [Pass] -> IO ()
solver ps = do solver ps = do
@ -50,8 +45,8 @@ solver ps = do
putStrLn "" putStrLn ""
putStrLn ">> Part 2" putStrLn ">> Part 2"
let taken = Set.fromList ps let taken = Set.fromList $ map seatId ps
print $ map seatId $ mySeats taken print $ mySeats taken
day :: Day day :: Day
day = dayParse "2020_05" parser solver day = dayParse "2020_05" parser solver