Advent of Code 2025

Day 8 less gross

Changed files
+26 -30
src
+26 -30
src/Day8.hs
···
pairs :: [a] -> [(a,a)]
pairs xs = [(x, y) | (x:ys) <- tails xs, y <- ys]
-
lastParent :: (Ord a, Show a) => a -> Map a a -> a
-
lastParent a m =
-
case Map.lookup a m of
-
Just a' -> lastParent a' m
-
Nothing -> a
+
merge :: (Point3, Point3) -> Map Point3 Int -> Map Point3 Int
+
merge (p, q) m =
+
let pid = m Map.! p
+
qid = m Map.! q
+
in if pid == qid then
+
m
+
else
+
Map.map (\c -> if c == pid then qid else c) m
part1 :: String -> String
part1 input =
···
dropWhile (\(p,q) -> p == q) $
sortBy (comparing (\(p,q) -> dist2 p q)) $
pairs boxes
-
parents =
-
foldl (\parents' (a,b) -> let a' = lastParent a parents'
-
b' = lastParent b parents'
-
in if a' == b' then
-
parents'
-
else
-
Map.insert b' a' parents')
-
Map.empty
+
circuits =
+
foldl (\ids' edge -> merge edge ids')
+
(Map.fromList $ zip boxes [1..])
(take 1000 connectionOrder)
sizes =
reverse $
sort $
map snd $
-
Map.toList $
-
foldl (\sizes' b -> Map.insertWith (+) (lastParent b parents) 1 sizes')
+
Map.toList $
+
Map.foldl (\sizes' c -> Map.insertWith (+) c 1 sizes')
Map.empty
-
boxes
+
circuits
in show $ product $ take 3 sizes
part2 :: String -> String
···
dropWhile (\(p,q) -> p == q) $
sortBy (comparing (\(p,q) -> dist2 p q)) $
pairs boxes
-
parents =
-
foldl (\parents' (a,b) -> let a' = lastParent a parents'
-
b' = lastParent b parents'
-
in if a' == b' then
-
parents'
-
else
-
Map.insert b' a' parents')
-
Map.empty
-
(take 4791 connectionOrder)
-
groups = length $
-
foldl (\sizes' b -> Map.insertWith (+) (lastParent b parents) 1 sizes')
-
Map.empty
-
boxes
-
in show $ (connectionOrder !! 4791)
+
circuits =
+
scanl (\ids' edge -> merge edge ids')
+
(Map.fromList $ zip boxes [1..])
+
connectionOrder
+
merges =
+
filter (\((p,q),ids) -> ids Map.! p /= ids Map.! q)
+
$ zip connectionOrder circuits
+
((p,q),_) = merges !! (length boxes - 2)
+
(x,_,_) = p
+
(x',_,_) = q
+
in show (x * x')
+