X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Fadvent10%2Fadvent10-iterate-zip.hs;h=3d3811bd6ede02d236840fb8089a83d6f412fa9d;hb=8227e18e534ac192b718bbfe0592e81a30f2a433;hp=ea26113e218941042052d1f8164c3e48440fc6de;hpb=7bc0f0ba5aeeecd90f6b7ca546d1b330f56f2996;p=advent-of-code-18.git diff --git a/src/advent10/advent10-iterate-zip.hs b/src/advent10/advent10-iterate-zip.hs index ea26113..3d3811b 100644 --- a/src/advent10/advent10-iterate-zip.hs +++ b/src/advent10/advent10-iterate-zip.hs @@ -17,8 +17,8 @@ import qualified Data.Set as S type Coord = (Integer, Integer) -- x, y type Bounds = (Integer, Integer, Integer, Integer) -- minX, maxX, minY, maxY data Particle = Particle {_position :: Coord, _velocity :: Coord} deriving (Eq, Show) -type Swarm = [Particle] -type Grid = S.Set Coord +type Grid = [Particle] +type Matrix = S.Set Coord main :: IO () main = do @@ -28,14 +28,14 @@ main = do putStrLn $ showParticles final print time -part0 :: Swarm -> (Swarm, Int) +part0 :: Grid -> (Grid, Int) part0 particles = (snd $ last $ gridPairs, length gridPairs) where gridPairs = findEnd particles -runParticles :: Swarm -> [Swarm] +runParticles :: Grid -> [Grid] runParticles = iterate updateAll -findEnd :: Swarm -> [(Swarm, Swarm)] +findEnd :: Grid -> [(Grid, Grid)] findEnd particles = takeWhile firstLarger gridPairs where grids = runParticles particles gridPairs = zip grids (drop 1 grids) @@ -43,11 +43,11 @@ findEnd particles = takeWhile firstLarger gridPairs -boundsArea :: Swarm -> Integer +boundsArea :: Grid -> Integer boundsArea particles = (maxX - minX) * (maxY - minY) where (minX, maxX, minY, maxY) = findBounds particles -findBounds :: Swarm -> Bounds +findBounds :: Grid -> Bounds findBounds particles = ( minX -- small x edge , maxX -- large x edge @@ -66,21 +66,21 @@ update particle = particle {_position = (x + vx, y + vy)} (vx, vy) = _velocity particle -updateAll :: Swarm -> Swarm +updateAll :: Grid -> Grid updateAll = map update -showParticles :: Swarm -> String +showParticles :: Grid -> String showParticles particles = intercalate "\n" rows where (minX, maxX, minY, maxY) = findBounds particles - grid = S.fromList $ map _position particles - rows = [showRow y minX maxX grid | y <- [minY..maxY] ] + swarm = S.fromList $ map _position particles + rows = [showRow y minX maxX swarm | y <- [minY..maxY] ] -showCell :: Integer -> Integer -> Grid -> Char +showCell :: Integer -> Integer -> Matrix -> Char showCell x y grid - | (x, y) `S.member` grid = '*' - | otherwise = ' ' + | (x, y) `S.member` grid = '\x2593' + | otherwise = '\x2591' -showRow :: Integer -> Integer -> Integer -> Grid -> String +showRow :: Integer -> Integer -> Integer -> Matrix -> String showRow y minX maxX grid = [showCell x y grid | x <- [minX..maxX] ] -- Parse the input file @@ -105,12 +105,12 @@ particleFileP = many particleP particleP = particlify <$> positionP <*> velocityP where particlify x v = Particle x v -positionP = posPrefix *> pairP <* suffix -velocityP = velPrefix *> pairP <* suffix +positionP = between posPrefix suffix pairP +velocityP = between velPrefix suffix pairP pairP = (,) <$> signedInteger <* commaP <*> signedInteger -successfulParse :: Text -> Swarm +successfulParse :: Text -> Grid successfulParse input = case parse particleFileP "input" input of Left _error -> [] -- TIO.putStr $ T.pack $ parseErrorPretty err