diff --git a/README.md b/README.md index d1eccd4..f3331f5 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ To arrive at [⟨ortho|normal⟩](https://hilb.ert.space) as December comes. | 06 | ~ 3 | | 07 | ~ 1 | | 08 | ~ 6.5 | -| 09 | | +| 09 | ~ 7 | | 10 | | | 11 | | | 12 | | diff --git a/app/Main.hs b/app/Main.hs index e48b8d4..362fe14 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -30,4 +30,4 @@ import qualified Day24 import qualified Day25 main :: IO () -main = Day09.main +main = Day10.main diff --git a/input/10.txt b/input/10.txt new file mode 100644 index 0000000..c8f8d4c --- /dev/null +++ b/input/10.txt @@ -0,0 +1,328 @@ +position=< 42772, -21149> velocity=<-4, 2> +position=< 42804, -31790> velocity=<-4, 3> +position=<-10445, -10502> velocity=< 1, 1> +position=<-31749, 21438> velocity=< 3, -2> +position=<-31722, 32074> velocity=< 3, -3> +position=< 53436, -21147> velocity=<-5, 2> +position=<-42336, -42437> velocity=< 4, 4> +position=<-42380, 21435> velocity=< 4, -2> +position=< 21508, -10506> velocity=<-2, 1> +position=<-31727, 42725> velocity=< 3, -4> +position=<-42383, 32083> velocity=< 4, -3> +position=< 42764, 21438> velocity=<-4, -2> +position=<-53037, -53086> velocity=< 5, 5> +position=< 53436, -10506> velocity=<-5, 1> +position=<-10445, 32083> velocity=< 1, -3> +position=<-53001, -53081> velocity=< 5, 5> +position=<-31724, -21151> velocity=< 3, 2> +position=<-21106, 42720> velocity=< 2, -4> +position=< 10847, -53083> velocity=<-1, 5> +position=< 21483, -21147> velocity=<-2, 2> +position=< 53433, -21146> velocity=<-5, 2> +position=< 32121, 42719> velocity=<-3, -4> +position=< 10834, 53364> velocity=<-1, -5> +position=<-31708, -42434> velocity=< 3, 4> +position=<-21057, -10497> velocity=< 2, 1> +position=<-42372, -53082> velocity=< 4, 5> +position=< 32143, -10502> velocity=<-3, 1> +position=<-31751, -53078> velocity=< 3, 5> +position=<-21069, 42720> velocity=< 2, -4> +position=<-21049, -42432> velocity=< 2, 4> +position=<-42376, 42727> velocity=< 4, -4> +position=< 42790, -21151> velocity=<-4, 2> +position=< 10849, 32082> velocity=<-1, -3> +position=<-31724, -21142> velocity=< 3, 2> +position=< 32159, -10498> velocity=<-3, 1> +position=< 32180, -21151> velocity=<-3, 2> +position=< 21491, 53368> velocity=<-2, -5> +position=< 32162, -21149> velocity=<-3, 2> +position=< 21482, -10505> velocity=<-2, 1> +position=<-52981, -53079> velocity=< 5, 5> +position=< 42796, 32079> velocity=<-4, -3> +position=<-21066, 42720> velocity=< 2, -4> +position=< 10862, 32083> velocity=<-1, -3> +position=< 21474, -53083> velocity=<-2, 5> +position=<-10434, -10497> velocity=< 1, 1> +position=<-21054, 53364> velocity=< 2, -5> +position=< 21534, 42723> velocity=<-2, -4> +position=< 10861, -21147> velocity=<-1, 2> +position=< 10857, -10502> velocity=<-1, 1> +position=< 53461, 32079> velocity=<-5, -3> +position=< 32132, -10505> velocity=<-3, 1> +position=<-42362, -21142> velocity=< 4, 2> +position=<-42396, 32074> velocity=< 4, -3> +position=< 53469, -21151> velocity=<-5, 2> +position=<-21098, 42723> velocity=< 2, -4> +position=<-42378, 32080> velocity=< 4, -3> +position=<-21074, 42726> velocity=< 2, -4> +position=< 10881, -10500> velocity=<-1, 1> +position=< 21514, 53367> velocity=<-2, -5> +position=< 42764, -53080> velocity=<-4, 5> +position=< 32151, 53368> velocity=<-3, -5> +position=<-21090, 21437> velocity=< 2, -2> +position=< 10877, -53078> velocity=<-1, 5> +position=<-10445, -31796> velocity=< 1, 3> +position=< 42796, 42722> velocity=<-4, -4> +position=<-31740, -21147> velocity=< 3, 2> +position=<-42344, -53083> velocity=< 4, 5> +position=<-21087, -31794> velocity=< 2, 3> +position=<-31691, 32082> velocity=< 3, -3> +position=< 21490, -31790> velocity=<-2, 3> +position=< 42792, -10506> velocity=<-4, 1> +position=< 53462, 32074> velocity=<-5, -3> +position=<-53025, 53366> velocity=< 5, -5> +position=<-31722, 21438> velocity=< 3, -2> +position=< 53469, 10786> velocity=<-5, -1> +position=< 10841, 32081> velocity=<-1, -3> +position=< 53449, 21431> velocity=<-5, -2> +position=<-21074, -10501> velocity=< 2, 1> +position=< 21487, -53084> velocity=<-2, 5> +position=<-53015, -53082> velocity=< 5, 5> +position=< 42777, -31787> velocity=<-4, 3> +position=< 42764, -10502> velocity=<-4, 1> +position=< 53422, 10787> velocity=<-5, -1> +position=< 42772, -10503> velocity=<-4, 1> +position=< 53465, 32081> velocity=<-5, -3> +position=<-10421, 10793> velocity=< 1, -1> +position=< 42815, -42432> velocity=<-4, 4> +position=<-21106, -53079> velocity=< 2, 5> +position=<-53033, 53369> velocity=< 5, -5> +position=< 42766, 53368> velocity=<-4, -5> +position=< 42767, -21151> velocity=<-4, 2> +position=< 21526, -31789> velocity=<-2, 3> +position=<-21082, -21148> velocity=< 2, 2> +position=< 53410, -21147> velocity=<-5, 2> +position=<-31691, -10500> velocity=< 3, 1> +position=< 42805, 32078> velocity=<-4, -3> +position=<-42378, -31790> velocity=< 4, 3> +position=<-21050, -21143> velocity=< 2, 2> +position=<-21106, -42436> velocity=< 2, 4> +position=<-53001, 53365> velocity=< 5, -5> +position=< 53469, -21145> velocity=<-5, 2> +position=< 10833, -31796> velocity=<-1, 3> +position=<-53009, -10498> velocity=< 5, 1> +position=< 32159, -31789> velocity=<-3, 3> +position=<-53007, -53077> velocity=< 5, 5> +position=< 21474, -21149> velocity=<-2, 2> +position=< 53427, -53083> velocity=<-5, 5> +position=< 10861, 42720> velocity=<-1, -4> +position=<-53017, 10786> velocity=< 5, -1> +position=<-42335, -42441> velocity=< 4, 4> +position=<-31751, -42432> velocity=< 3, 4> +position=< 32171, 21429> velocity=<-3, -2> +position=<-53016, -53086> velocity=< 5, 5> +position=< 21522, 21436> velocity=<-2, -2> +position=<-53009, -53079> velocity=< 5, 5> +position=< 53433, 42721> velocity=<-5, -4> +position=< 53420, -42441> velocity=<-5, 4> +position=< 42777, -10504> velocity=<-4, 1> +position=<-10416, 32074> velocity=< 1, -3> +position=<-42396, 10788> velocity=< 4, -1> +position=< 21490, 10791> velocity=<-2, -1> +position=< 32128, -21147> velocity=<-3, 2> +position=< 53461, -21143> velocity=<-5, 2> +position=<-21063, -21149> velocity=< 2, 2> +position=<-31743, -31792> velocity=< 3, 3> +position=< 21514, 21432> velocity=<-2, -2> +position=< 10861, 10791> velocity=<-1, -1> +position=< 10881, -31792> velocity=<-1, 3> +position=< 10889, -31795> velocity=<-1, 3> +position=< 32143, -21145> velocity=<-3, 2> +position=<-21093, -42439> velocity=< 2, 4> +position=<-10450, 21433> velocity=< 1, -2> +position=<-31719, 21430> velocity=< 3, -2> +position=< 10865, 53373> velocity=<-1, -5> +position=<-10405, -21144> velocity=< 1, 2> +position=< 21534, -42433> velocity=<-2, 4> +position=<-31727, -53083> velocity=< 3, 5> +position=<-53021, 21437> velocity=< 5, -2> +position=< 53449, -42434> velocity=<-5, 4> +position=<-21046, 10789> velocity=< 2, -1> +position=< 21518, 32082> velocity=<-2, -3> +position=<-31727, -10506> velocity=< 3, 1> +position=<-53033, 10793> velocity=< 5, -1> +position=< 10842, -10498> velocity=<-1, 1> +position=< 53425, 32075> velocity=<-5, -3> +position=<-53004, 32082> velocity=< 5, -3> +position=<-53016, -53082> velocity=< 5, 5> +position=<-21098, 21435> velocity=< 2, -2> +position=<-10417, 42720> velocity=< 1, -4> +position=<-42363, 21429> velocity=< 4, -2> +position=< 32151, 10790> velocity=<-3, -1> +position=<-53025, 21431> velocity=< 5, -2> +position=<-10437, -42435> velocity=< 1, 4> +position=<-31735, -10502> velocity=< 3, 1> +position=<-21098, -21149> velocity=< 2, 2> +position=< 10830, 10784> velocity=<-1, -1> +position=< 10838, -21151> velocity=<-1, 2> +position=<-21085, -21142> velocity=< 2, 2> +position=< 32119, -53079> velocity=<-3, 5> +position=<-31700, 21438> velocity=< 3, -2> +position=<-31714, -31795> velocity=< 3, 3> +position=< 32135, -10504> velocity=<-3, 1> +position=< 10889, -21149> velocity=<-1, 2> +position=<-31742, -53086> velocity=< 3, 5> +position=<-31726, -42432> velocity=< 3, 4> +position=<-31727, -53079> velocity=< 3, 5> +position=<-42369, -31792> velocity=< 4, 3> +position=< 10830, -42437> velocity=<-1, 4> +position=< 32179, 42725> velocity=<-3, -4> +position=< 21483, -31796> velocity=<-2, 3> +position=< 53435, 32074> velocity=<-5, -3> +position=< 32132, -31788> velocity=<-3, 3> +position=< 53449, 10787> velocity=<-5, -1> +position=<-21066, -42439> velocity=< 2, 4> +position=<-21065, 10789> velocity=< 2, -1> +position=<-31693, -31787> velocity=< 3, 3> +position=<-42380, 42727> velocity=< 4, -4> +position=< 42788, 10785> velocity=<-4, -1> +position=<-21054, -21150> velocity=< 2, 2> +position=< 42772, -42434> velocity=<-4, 4> +position=<-31722, 42719> velocity=< 3, -4> +position=< 10837, -31794> velocity=<-1, 3> +position=< 21498, -42436> velocity=<-2, 4> +position=< 42797, 10793> velocity=<-4, -1> +position=<-42372, 42724> velocity=< 4, -4> +position=< 32171, 10787> velocity=<-3, -1> +position=<-21085, -42441> velocity=< 2, 4> +position=<-21046, 10791> velocity=< 2, -1> +position=<-31709, 53370> velocity=< 3, -5> +position=< 21503, 21438> velocity=<-2, -2> +position=<-31695, -10498> velocity=< 3, 1> +position=<-10411, -53077> velocity=< 1, 5> +position=< 32169, 21438> velocity=<-3, -2> +position=< 53454, -42441> velocity=<-5, 4> +position=< 21487, 10785> velocity=<-2, -1> +position=<-31711, 10792> velocity=< 3, -1> +position=<-21085, -10497> velocity=< 2, 1> +position=<-42360, -42432> velocity=< 4, 4> +position=<-21090, 21434> velocity=< 2, -2> +position=<-31739, 32074> velocity=< 3, -3> +position=< 53417, -10502> velocity=<-5, 1> +position=<-42364, -21149> velocity=< 4, 2> +position=< 42767, -21147> velocity=<-4, 2> +position=< 21502, 10784> velocity=<-2, -1> +position=<-53016, -53077> velocity=< 5, 5> +position=<-10401, 10787> velocity=< 1, -1> +position=<-31715, 53373> velocity=< 3, -5> +position=< 10869, 53364> velocity=<-1, -5> +position=< 10848, -10499> velocity=<-1, 1> +position=< 10880, -10497> velocity=<-1, 1> +position=<-31749, 32074> velocity=< 3, -3> +position=<-42388, -31788> velocity=< 4, 3> +position=<-10440, 42719> velocity=< 1, -4> +position=< 10857, -53082> velocity=<-1, 5> +position=< 53461, -21147> velocity=<-5, 2> +position=<-21063, -10499> velocity=< 2, 1> +position=< 32124, 42728> velocity=<-3, -4> +position=<-21102, 10788> velocity=< 2, -1> +position=< 32179, 32079> velocity=<-3, -3> +position=< 10837, 32075> velocity=<-1, -3> +position=<-42383, 32077> velocity=< 4, -3> +position=< 42769, 21429> velocity=<-4, -2> +position=< 21495, -10497> velocity=<-2, 1> +position=< 32151, -42436> velocity=<-3, 4> +position=< 32129, 10784> velocity=<-3, -1> +position=<-31750, 10793> velocity=< 3, -1> +position=< 53449, -42432> velocity=<-5, 4> +position=< 32128, -42437> velocity=<-3, 4> +position=<-42377, -21144> velocity=< 4, 2> +position=< 10833, 53373> velocity=<-1, -5> +position=< 32143, 32083> velocity=<-3, -3> +position=< 42816, -31792> velocity=<-4, 3> +position=<-31727, 42728> velocity=< 3, -4> +position=<-21103, 42719> velocity=< 2, -4> +position=<-42368, 21438> velocity=< 4, -2> +position=<-21098, -10500> velocity=< 2, 1> +position=<-31735, -10506> velocity=< 3, 1> +position=<-42391, 32074> velocity=< 4, -3> +position=<-21095, -53081> velocity=< 2, 5> +position=<-21079, -21147> velocity=< 2, 2> +position=< 32151, 53366> velocity=<-3, -5> +position=<-42396, 10785> velocity=< 4, -1> +position=< 32119, 21434> velocity=<-3, -2> +position=<-31716, -42432> velocity=< 3, 4> +position=< 32162, 32081> velocity=<-3, -3> +position=< 10845, 21430> velocity=<-1, -2> +position=< 32119, -21149> velocity=<-3, 2> +position=< 53461, -10504> velocity=<-5, 1> +position=<-21074, -42438> velocity=< 2, 4> +position=< 10873, 53372> velocity=<-1, -5> +position=<-42380, -31792> velocity=< 4, 3> +position=<-31751, 10788> velocity=< 3, -1> +position=<-31735, -53086> velocity=< 3, 5> +position=< 21499, 10788> velocity=<-2, -1> +position=< 32147, 10784> velocity=<-3, -1> +position=<-10409, 42721> velocity=< 1, -4> +position=< 21492, -42435> velocity=<-2, 4> +position=< 10885, -42434> velocity=<-1, 4> +position=< 53409, -42433> velocity=<-5, 4> +position=<-31699, 10784> velocity=< 3, -1> +position=< 53459, -31787> velocity=<-5, 3> +position=<-21093, -42433> velocity=< 2, 4> +position=< 53436, -42432> velocity=<-5, 4> +position=< 42764, 42727> velocity=<-4, -4> +position=<-52982, 10793> velocity=< 5, -1> +position=<-21061, -53077> velocity=< 2, 5> +position=< 21525, 10784> velocity=<-2, -1> +position=<-10401, -53083> velocity=< 1, 5> +position=< 10833, 10793> velocity=<-1, -1> +position=< 42767, 10793> velocity=<-4, -1> +position=< 10869, 21429> velocity=<-1, -2> +position=<-42370, -53082> velocity=< 4, 5> +position=< 10881, 53372> velocity=<-1, -5> +position=<-10461, 21429> velocity=< 1, -2> +position=<-21080, -42432> velocity=< 2, 4> +position=< 42817, 10784> velocity=<-4, -1> +position=< 42805, -10501> velocity=<-4, 1> +position=<-42371, -31796> velocity=< 4, 3> +position=<-42388, 32079> velocity=< 4, -3> +position=< 21490, 21436> velocity=<-2, -2> +position=<-10421, 42726> velocity=< 1, -4> +position=< 21492, 42722> velocity=<-2, -4> +position=< 42799, 42728> velocity=<-4, -4> +position=<-53025, 10787> velocity=< 5, -1> +position=< 21474, -42441> velocity=<-2, 4> +position=< 53433, 10792> velocity=<-5, -1> +position=< 32130, -31796> velocity=<-3, 3> +position=< 53438, -10506> velocity=<-5, 1> +position=<-10445, -21146> velocity=< 1, 2> +position=< 21518, -10505> velocity=<-2, 1> +position=< 32151, 42722> velocity=<-3, -4> +position=< 21514, 42723> velocity=<-2, -4> +position=<-31739, 21433> velocity=< 3, -2> +position=<-21094, -10506> velocity=< 2, 1> +position=< 32129, -31792> velocity=<-3, 3> +position=< 42824, -53084> velocity=<-4, 5> +position=<-52999, -42435> velocity=< 5, 4> +position=< 53409, -31794> velocity=<-5, 3> +position=<-42353, -10504> velocity=< 4, 1> +position=< 32132, -42432> velocity=<-3, 4> +position=< 42780, -42436> velocity=<-4, 4> +position=< 10888, -31796> velocity=<-1, 3> +position=<-10421, -53077> velocity=< 1, 5> +position=<-53033, -21150> velocity=< 5, 2> +position=< 21494, -53085> velocity=<-2, 5> +position=< 21533, -10506> velocity=<-2, 1> +position=< 53421, 32080> velocity=<-5, -3> +position=< 32159, -10501> velocity=<-3, 1> +position=< 10881, 21436> velocity=<-1, -2> +position=< 21493, 32081> velocity=<-2, -3> +position=<-42363, 53364> velocity=< 4, -5> +position=<-52993, 42727> velocity=< 5, -4> +position=< 10841, -31792> velocity=<-1, 3> +position=< 10871, -53083> velocity=<-1, 5> +position=<-42379, 53369> velocity=< 4, -5> +position=< 21518, 21430> velocity=<-2, -2> +position=<-31727, 32078> velocity=< 3, -3> +position=<-42361, -31796> velocity=< 4, 3> +position=< 32123, -21142> velocity=<-3, 2> +position=< 10856, 10784> velocity=<-1, -1> +position=< 10853, 21430> velocity=<-1, -2> +position=< 21498, -31787> velocity=<-2, 3> +position=<-21098, -10506> velocity=< 2, 1> +position=<-42388, -10501> velocity=< 4, 1> +position=<-42395, -31796> velocity=< 4, 3> +position=< 10870, -42436> velocity=<-1, 4> +position=< 42824, -10501> velocity=<-4, 1> +position=< 42800, 10784> velocity=<-4, -1> diff --git a/package.yaml b/package.yaml index c9d7cf1..2267f2e 100644 --- a/package.yaml +++ b/package.yaml @@ -24,6 +24,7 @@ dependencies: - containers - text - extra +- matrix library: source-dirs: src diff --git a/src/Day10.hs b/src/Day10.hs index 6eb3e43..4f158e3 100644 --- a/src/Day10.hs +++ b/src/Day10.hs @@ -1,6 +1,49 @@ module Day10 (main) where +import Data.List (sortBy, groupBy) +import Data.Ord (comparing) +import Data.Function (on) +import Data.Tuple.Extra ((***)) +import Data.Matrix (matrix, toLists) + +type Point = (Position, Velocity) +type Position = (Int, Int) -- ( x, y) +type Velocity = (Int, Int) -- (dx, dy) + +stepPoint :: Point -> Point +stepPoint ((x, y), (dx, dy)) = ((x + dx, y + dy), (dx, dy)) + +parse :: String -> Point +parse str = + let position = "(" ++ (take 14 . drop 10 $ str) ++ ")" + velocity = "(" ++ (take 6 . drop 36 $ str) ++ ")" + in (read position, read velocity) + +alignedX :: Int -> [Point] -> Bool +alignedX n = + any nearby . map (snd . unzip) . groupBy ((==) `on` fst) . sortBy (comparing fst) . fst . unzip + where nearby ys = length ys >= n && (maximum ys) - (minimum ys) < n + +toGrid :: [Point] -> String +toGrid points = + let positions = fst . unzip $ points + minX = minimum . fst . unzip $ positions + minY = minimum . snd . unzip $ positions + maxX = maximum . fst . unzip $ positions + maxY = maximum . snd . unzip $ positions + isPoint (y, x) = if (x + minX - 1, y + minY - 1) `elem` positions then '#' else '.' + grid = matrix (maxY - minY + 1) (maxX - minX + 1) isPoint + in unlines . toLists $ grid + +part1 :: Int -> [Point] -> (String, Int) +part1 sec points = + if alignedX 10 points + then (toGrid $ points, sec) + else part1 (sec + 1) $ map stepPoint points + main :: IO () main = do - input <- readFile "input/10.txt" - print input \ No newline at end of file + input <- map parse . lines <$> readFile "input/10.txt" + let result = part1 0 input + putStrLn $ fst result + print $ snd result