Tidied some long lines
[advent-of-code-17.git] / src / advent20 / advent20.hs
index 5aac088be3b995678a2f72e9bf43536be7ad1869..4d852a604d299fcf9ca7f762867c72dd4074bfc5 100644 (file)
@@ -13,7 +13,6 @@ import qualified Text.Megaparsec.Lexer as L
 import Text.Megaparsec.Text (Parser)
 import qualified Control.Applicative as CA
 
--- import Data.Vector ((!), (//))
 import qualified Data.Vector as V
 
 import Data.List 
@@ -35,7 +34,7 @@ main = do
         text <- TIO.readFile "data/advent20.txt"
         let particles = successfulParse text
         print $ part1 particles
-        print $ part2 500 particles
+        print $ part2 50 particles
 
 
 part1 :: [Particle] -> Int
@@ -60,20 +59,25 @@ simulateC t particles = simulateC (t - 1) (map step particles')
 
 step :: Particle -> Particle
 step particle = particle {position = p', velocity = v'}
-    where pv' = V.zipWith3 updatePV (position particle) (velocity particle) (acceleration particle)
-          !(p', v') = V.unzip pv'
+    where pv' = V.zipWith3 updatePV (position particle) 
+                                    (velocity particle) 
+                                    (acceleration particle)
+          (p', v') = V.unzip pv'
           updatePV p v a = (p + v + a, v + a)
 
 
 -- Checks whether a particle could ever get closer to the origin than it is now.
 quiescent :: Particle -> Bool
 quiescent particle = and qDimensions
-    where qDimensions = V.zipWith3 sameSigns (position particle) (velocity particle) (acceleration particle)
-          sameSigns !p !v !a = if a == 0 && v == 0
-                               then True
-                               else if a == 0
-                                    then signum p == signum v
-                                    else signum p == signum v && signum v == signum a
+    where qDimensions = V.zipWith3 sameSigns (position particle) 
+                                             (velocity particle) 
+                                             (acceleration particle)
+          sameSigns p v a = if a == 0 && v == 0
+                            then True
+                            else if a == 0
+                                 then signum p == signum v
+                                 else signum p == signum v 
+                                        && signum v == signum a
 
 
 withMinX particles = minX `elemIndices` absXs
@@ -84,11 +88,15 @@ pAbsX :: Particle -> Integer
 pAbsX particle = V.foldl1' (+) $ V.map abs (position particle)  
 
 
-
 removeColliders particles = particles'
     where positions = map position particles
-          duplicatePositions = S.fromList $ concat $ filter (\g -> length g > 1) $ group $ sort positions
-          particles' = filter (\p -> not (S.member (position p) duplicatePositions)) particles
+          duplicatePositions = S.fromList $ concat 
+                                          $ filter (\g -> length g > 1) 
+                                          $ group 
+                                          $ sort positions
+          particles' = filter (\p -> not (S.member (position p) 
+                                                   duplicatePositions)) 
+                              particles
 
 
 
@@ -108,10 +116,14 @@ particlesP = particleP `sepBy` space
 particleP = particlify <$> (symbol "p=" *> vecP <* separator)
                        <*> (symbol "v=" *> vecP <* separator)
                        <*> (symbol "a=" *> vecP)
-    where particlify p v a = Particle {position = p, velocity = v, acceleration = a}
+    where particlify p v a = Particle { position = p
+                                      , velocity = v
+                                      , acceleration = a
+                                      }
 
 
-vecP = V.fromList <$> between (symbol "<") (symbol ">") (signedInteger `sepBy` comma)
+vecP = V.fromList <$> between (symbol "<") (symbol ">") 
+                              (signedInteger `sepBy` comma)
 
 
 successfulParse :: Text -> [Particle]