diff --git a/2019/day12/day12.hs b/2019/day12/day12.hs index d5e5c07..cb9e6ed 100644 --- a/2019/day12/day12.hs +++ b/2019/day12/day12.hs @@ -1,7 +1,6 @@ import Data.List import Data.List.Split import Linear.V3 - main :: IO () main = do moons <- parseContent <$> readFile "input" @@ -9,17 +8,20 @@ main = do print $ part1 (toV3 moons, toV3 velocity) print $ part2 (moons, velocity) -part1 :: ([V3 Int], [V3 Int]) -> Int -part1 x = energy $ iterate step x !! 1000 +parseContent :: String -> [[Int]] +parseContent = map (map read . splitOn ",") . lines . removeJunk + where + removeJunk xs = [x | x <- xs, x `notElem` " <>xyz="] --I’m sure there is a better way to do this toV3 :: [[Int]] -> [V3 Int] toV3 = map (\[x, y, z] -> V3 x y z) -parseContent :: String -> [[Int]] -parseContent = map (map read . splitOn ",") . lines . removeJunk +part1 :: ([V3 Int], [V3 Int]) -> Int +part1 input = energy $ iterate step input !! 1000 where - removeJunk xs = [x | x <- xs, x `notElem` " <>xyz="] + energy (x, y) = sum $ zipWith (*) (geten x) (geten y) + geten = map (sum . abs) step :: (Num a, Eq a) => ([a], [a]) -> ([a], [a]) step (moons, vel) = (zipWith (+) moons newVel, newVel) @@ -28,18 +30,6 @@ step (moons, vel) = (zipWith (+) moons newVel, newVel) newVel = zipWith (+) vel dVel gravity xs = [sum [signum $ x - y | x <- xs, y /= x] | y <- xs] -energy :: ([V3 Int], [V3 Int]) -> Int -energy (x, y) = sum $ zipWith (*) (geten x) (geten y) - where - geten = map (sum . abs) - -findPeriod :: (Num a, Eq a) => ([a], [a]) -> ([a], [a]) -> Int -> Int -findPeriod x a n = - if x' == a - then n - else findPeriod x' a (n + 1) - where - x' = step x part2 :: (Num a, Eq a) => ([[a]], [[a]]) -> Int part2 (moons, vel) = lcm' periods @@ -49,6 +39,14 @@ part2 (moons, vel) = lcm' periods periods = zipWith (curry findPeriod') m v findPeriod' x = findPeriod x x 1 +findPeriod :: (Num a, Eq a) => ([a], [a]) -> ([a], [a]) -> Int -> Int +findPeriod x a n = + if x' == a + then n + else findPeriod x' a (n + 1) + where + x' = step x + lcm' :: [Int] -> Int lcm' xs = product $ zipWith (^) nums maxElems where