[hs] Clean up 2020_05 even more
This commit is contained in:
parent
aa7658e17f
commit
eb8a9795ed
1 changed files with 12 additions and 21 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue