Skip to content

Commit 7f98b05

Browse files
Merge pull request #34 from MartinZikmund/feature/aoc2025-day8
2 parents 6e5fa32 + 1b6310f commit 7f98b05

4 files changed

Lines changed: 164 additions & 0 deletions

File tree

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
namespace AdventOfCode.Puzzles._2025._08.Part1;
2+
3+
public class AoC2025Day8Part1 : IPuzzleSolution
4+
{
5+
public async Task<string> SolveAsync(StreamReader inputReader)
6+
{
7+
var lines = await inputReader.ReadAllLinesAsync();
8+
int targetConnections = lines.Count < 50 ? 10 : 1000;
9+
10+
var boxes = new List<Point3d>();
11+
foreach (var line in lines)
12+
{
13+
var parts = line.Split(',', StringSplitOptions.TrimEntries);
14+
boxes.Add(new Point3d
15+
{
16+
X = int.Parse(parts[0]),
17+
Y = int.Parse(parts[1]),
18+
Z = int.Parse(parts[2]),
19+
});
20+
}
21+
22+
var distinctDistances = new List<(Point3d box1, Point3d box2, double distance)>();
23+
24+
var distances = new Dictionary<(Point3d, Point3d), double>();
25+
for (int box1 = 0; box1 < boxes.Count; box1++)
26+
{
27+
for (int box2 = box1 + 1; box2 < boxes.Count; box2++)
28+
{
29+
var distance = boxes[box1].Distance(boxes[box2]);
30+
distances[(boxes[box1], boxes[box2])] = distance;
31+
distances[(boxes[box2], boxes[box1])] = distance;
32+
distinctDistances.Add((boxes[box1], boxes[box2], distance));
33+
}
34+
}
35+
36+
distinctDistances = distinctDistances
37+
.OrderBy(t => t.distance)
38+
.ToList();
39+
40+
var circuits = new Dictionary<Point3d, List<Point3d>>();
41+
foreach (var box in boxes)
42+
{
43+
var circuit = new List<Point3d> { box };
44+
circuits.Add(box, circuit);
45+
}
46+
47+
for (var distanceId = 0; distanceId < targetConnections; distanceId++)
48+
{
49+
var (box1, box2, distance) = distinctDistances[distanceId];
50+
51+
var circuit1 = circuits[box1];
52+
var circuit2 = circuits[box2];
53+
if (circuit1 != circuit2)
54+
{
55+
// Merge circuits
56+
circuit1.AddRange(circuit2);
57+
foreach (var box in circuit2)
58+
{
59+
circuits[box] = circuit1;
60+
}
61+
}
62+
}
63+
64+
var largestCircuits = circuits
65+
.Select(c => c.Value)
66+
.Distinct()
67+
.OrderByDescending(c => c.Count)
68+
.Select(c => c.Count)
69+
.Take(3)
70+
.ToArray();
71+
return (largestCircuits[0] * largestCircuits[1] * largestCircuits[2]).ToString();
72+
}
73+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
namespace AdventOfCode.Puzzles._2025._08.Part2;
2+
3+
public class AoC2025Day8Part2 : IPuzzleSolution
4+
{
5+
public async Task<string> SolveAsync(StreamReader inputReader)
6+
{
7+
var lines = await inputReader.ReadAllLinesAsync();
8+
int targetConnections = lines.Count < 50 ? 10 : 1000;
9+
10+
var boxes = new List<Point3d>();
11+
foreach (var line in lines)
12+
{
13+
var parts = line.Split(',', StringSplitOptions.TrimEntries);
14+
boxes.Add(new Point3d
15+
{
16+
X = int.Parse(parts[0]),
17+
Y = int.Parse(parts[1]),
18+
Z = int.Parse(parts[2]),
19+
});
20+
}
21+
22+
var distinctDistances = new List<(Point3d box1, Point3d box2, double distance)>();
23+
24+
var distances = new Dictionary<(Point3d, Point3d), double>();
25+
for (int box1 = 0; box1 < boxes.Count; box1++)
26+
{
27+
for (int box2 = box1 + 1; box2 < boxes.Count; box2++)
28+
{
29+
var distance = boxes[box1].Distance(boxes[box2]);
30+
distances[(boxes[box1], boxes[box2])] = distance;
31+
distances[(boxes[box2], boxes[box1])] = distance;
32+
distinctDistances.Add((boxes[box1], boxes[box2], distance));
33+
}
34+
}
35+
36+
distinctDistances = distinctDistances
37+
.OrderBy(t => t.distance)
38+
.ToList();
39+
40+
var circuits = new Dictionary<Point3d, List<Point3d>>();
41+
foreach (var box in boxes)
42+
{
43+
var circuit = new List<Point3d> { box };
44+
circuits.Add(box, circuit);
45+
}
46+
47+
for (var distanceId = 0; ; distanceId++)
48+
{
49+
var (box1, box2, distance) = distinctDistances[distanceId];
50+
51+
var circuit1 = circuits[box1];
52+
var circuit2 = circuits[box2];
53+
if (circuit1 != circuit2)
54+
{
55+
// Merge circuits
56+
circuit1.AddRange(circuit2);
57+
foreach (var box in circuit2)
58+
{
59+
circuits[box] = circuit1;
60+
}
61+
62+
if (circuit1.Count == boxes.Count)
63+
{
64+
return (box1.X * box2.X).ToString();
65+
}
66+
}
67+
}
68+
}
69+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
162,817,812
2+
57,618,57
3+
906,360,560
4+
592,479,940
5+
352,342,300
6+
466,668,158
7+
542,29,236
8+
431,825,988
9+
739,650,466
10+
52,470,668
11+
216,146,977
12+
819,987,18
13+
117,168,530
14+
805,96,715
15+
346,949,466
16+
970,615,88
17+
941,993,340
18+
862,61,35
19+
984,92,344
20+
425,690,689

src/AdventOfCode.Puzzles/Tools/Point3d.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@ public record struct Point3d(int X, int Y, int Z)
1111
public static implicit operator Point3d((int X, int Y, int Z) tuple) => new Point3d(tuple.X, tuple.Y, tuple.Z);
1212

1313
public int ManhattanDistance(Point3d b) => Math.Abs(X - b.X) + Math.Abs(Y - b.Y) + Math.Abs(Z - b.Z);
14+
15+
public double Distance(Point3d b) => Math.Sqrt(Math.Pow(X - b.X, 2) + Math.Pow(Y - b.Y, 2) + Math.Pow(Z - b.Z, 2));
1416
}

0 commit comments

Comments
 (0)