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