Skip to content

Commit 201cf1f

Browse files
committed
2025 Day 8
1 parent de53438 commit 201cf1f

File tree

4 files changed

+97
-3
lines changed

4 files changed

+97
-3
lines changed

2025/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
_build
22
inputs
3+
flamegraph.svg
4+
stacks.folded
5+
perf.data

2025/days/Day08.ml

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,61 @@
11
open Utils
22

3-
let day08 input =
4-
("TODO", "TODO")
3+
let parse input =
4+
trim_end_nl input
5+
|> String.split_on_char '\n'
6+
|> List.map (fun l ->
7+
let a, b = string_split_once "," l in
8+
let b, c = string_split_once "," b in
9+
tmap3 int_of_string (a, b, c))
10+
|> Array.of_list
11+
12+
let sq_dist (ax, ay, az) (bx, by, bz) =
13+
let dx, dy, dz = ax - bx, ay - by, az - bz in
14+
dx * dx + dy * dy + dz * dz
15+
16+
let prep verts =
17+
let n = Array.length verts in
18+
let arr = Array.make (n * (n - 1) / 2) (0, 0, 0) in
19+
20+
let rec populate a b i = if a < n - 1 then begin
21+
if b >= n then populate (a + 1) (a + 2) i
22+
else begin
23+
arr.(i) <- (sq_dist verts.(a) verts.(b), a, b);
24+
populate a (b + 1) (i + 1)
25+
end
26+
end in
27+
28+
populate 0 1 0;
29+
Array.fast_sort (fun (a, _, _) (b, _, _) -> Int.compare a b) arr;
30+
31+
Array.to_list arr
532

33+
let solve_part1 verts pairs =
34+
let n = Array.length verts in
35+
let sets = UnionFind.make n in
636

37+
List.take 1000 pairs
38+
|> List.iter (fun (_, a, b) -> UnionFind.union a b sets);
39+
40+
UnionFind.sizes sets
41+
|> List.sort (fun a b -> Int.compare b a)
42+
|> List.take 3
43+
|> List.fold_left ( * ) 1
44+
45+
let solve_part2 verts pairs =
46+
let n = Array.length verts in
47+
let sets = UnionFind.make n in
48+
49+
let rec aux (ax, _, _) (bx, _, _) = function
50+
| _ when UnionFind.components sets = 1 -> ax * bx
51+
| (_, a, b) :: r -> (UnionFind.union a b sets; aux verts.(a) verts.(b) r)
52+
| [] -> failwith "Made every connection without connecting everything, interesting."
53+
in
54+
aux (0, 0, 0) (0, 0, 0) pairs
55+
56+
let day08 input =
57+
let verts = parse input in
58+
let pairs = prep verts in
59+
let part1 = solve_part1 verts pairs in
60+
let part2 = solve_part2 verts pairs in
61+
(string_of_int part1, string_of_int part2)

2025/days/Utils.ml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,39 @@ let transpose = function
9090
| [] -> []
9191
| x::xs -> List.(fold_right (fun l a -> map2 cons l a) (x::xs) (map (fun _ -> []) x))
9292

93+
let id x = x
94+
95+
let range a b = List.init (b - a + 1) ((+) a)
96+
97+
let range_pairs a b =
98+
range a (b - 1)
99+
|> List.(
100+
concat_map (fun i -> range (i + 1) b
101+
|> map (fun j -> i, j)))
102+
103+
module UnionFind = struct
104+
type t = {parents: int array; sizes: int array; mutable components: int}
105+
106+
let make n = { parents = Array.init n id; sizes = Array.make n 1; components = n }
107+
let rec find x s =
108+
let parent = s.parents.(x) in
109+
if parent <> x then (
110+
let res = find parent s in
111+
s.parents.(x) <- res;
112+
res
113+
) else x
114+
let union x y s =
115+
let x, y = find x s, find y s in
116+
if x <> y then begin
117+
let sx, sy = s.sizes.(x), s.sizes.(y) in
118+
let x, y, rx, ry = if sx < sy then y, x, sy, sx else x, y, sx, sy in
119+
120+
s.components <- s.components - 1;
121+
s.parents.(y) <- x;
122+
s.sizes.(x) <- rx + ry;
123+
s.sizes.(y) <- 0;
124+
end
125+
let sizes s = Array.to_list s.sizes |> List.filter ((<) 0)
126+
let size x s = s.sizes.(find x s)
127+
let components s = s.components
128+
end

2025/lib/Aoc.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ let days =
5151
(5, Day05.day05);
5252
(6, Day06.day06);
5353
(7, Day07.day07);
54-
(* (8, Day08.day08); *)
54+
(8, Day08.day08);
5555
(* (9, Day09.day09); *)
5656
(* (10, Day10.day10); *)
5757
(* (11, Day11.day11); *)

0 commit comments

Comments
 (0)