feat: Add day 8
This commit is contained in:
parent
b37717d05f
commit
96f50957a4
3 changed files with 1185 additions and 0 deletions
20
AdventOfCode2025/Inputs/Day8_0.txt
Normal file
20
AdventOfCode2025/Inputs/Day8_0.txt
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
162,817,812
|
||||
57,618,57
|
||||
906,360,560
|
||||
592,479,940
|
||||
352,342,300
|
||||
466,668,158
|
||||
542,29,236
|
||||
431,825,988
|
||||
739,650,466
|
||||
52,470,668
|
||||
216,146,977
|
||||
819,987,18
|
||||
117,168,530
|
||||
805,96,715
|
||||
346,949,466
|
||||
970,615,88
|
||||
941,993,340
|
||||
862,61,35
|
||||
984,92,344
|
||||
425,690,689
|
||||
1000
AdventOfCode2025/Inputs/Day8_1.txt
Normal file
1000
AdventOfCode2025/Inputs/Day8_1.txt
Normal file
File diff suppressed because it is too large
Load diff
165
AdventOfCode2025/Solutions/Day8.cs
Normal file
165
AdventOfCode2025/Solutions/Day8.cs
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
namespace AdventOfCode2025.Solutions;
|
||||
|
||||
public class Day8() : Solution(8)
|
||||
{
|
||||
public override string SolvePart1()
|
||||
{
|
||||
List<JunctionBox> boxes = Input
|
||||
.Lines
|
||||
.Select(line => line.Split(','))
|
||||
.Select(parts => new JunctionBox(long.Parse(parts[0]), long.Parse(parts[1]), long.Parse(parts[2])))
|
||||
.ToList();
|
||||
|
||||
IOrderedEnumerable<(JunctionBox Box1, JunctionBox Box2, long Distance)> allPairs = CreateAllPairs(boxes).OrderBy(pair => pair.Distance);
|
||||
|
||||
const int numberOfConnections = 1000;
|
||||
var countConnections = 0;
|
||||
|
||||
foreach (var (box1, box2, _) in allPairs)
|
||||
{
|
||||
if (countConnections >= numberOfConnections)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
box1.ConnectTo(box2);
|
||||
countConnections++;
|
||||
}
|
||||
|
||||
IEnumerable<int> networkSizes = boxes
|
||||
.Select(b => b.Network)
|
||||
.Where(n => n is not null)
|
||||
.Distinct()
|
||||
.Select(n => n!.Boxes.Count)
|
||||
.OrderByDescending(size => size);
|
||||
|
||||
return networkSizes
|
||||
.Take(3)
|
||||
.Aggregate(1, (a, b) => a * b)
|
||||
.ToString();
|
||||
}
|
||||
|
||||
public override string SolvePart2()
|
||||
{
|
||||
List<JunctionBox> boxes = Input
|
||||
.Lines
|
||||
.Select(line => line.Split(','))
|
||||
.Select(parts => new JunctionBox(long.Parse(parts[0]), long.Parse(parts[1]), long.Parse(parts[2])))
|
||||
.ToList();
|
||||
|
||||
IOrderedEnumerable<(JunctionBox Box1, JunctionBox Box2, long Distance)> allPairs = CreateAllPairs(boxes).OrderBy(pair => pair.Distance);
|
||||
|
||||
JunctionBox? lastBox1 = null;
|
||||
JunctionBox? lastBox2 = null;
|
||||
|
||||
foreach (var (box1, box2, _) in allPairs)
|
||||
{
|
||||
if (!box1.ConnectTo(box2))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
lastBox1 = box1;
|
||||
lastBox2 = box2;
|
||||
|
||||
var isolatedBoxes = boxes.Count(b => b.Network is null);
|
||||
var distinctNetworks = boxes
|
||||
.Select(b => b.Network)
|
||||
.Where(n => n is not null)
|
||||
.Distinct()
|
||||
.Count();
|
||||
|
||||
var totalCircuits = isolatedBoxes + distinctNetworks;
|
||||
if (totalCircuits == 1)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return (lastBox1!.X * lastBox2!.X).ToString();
|
||||
}
|
||||
|
||||
private static IEnumerable<(JunctionBox Box1, JunctionBox Box2, long Distance)> CreateAllPairs(List<JunctionBox> boxes)
|
||||
{
|
||||
List<(JunctionBox Box1, JunctionBox Box2, long Distance)> pairs = [];
|
||||
for (var i = 0; i < boxes.Count; i++)
|
||||
{
|
||||
for (var j = i + 1; j < boxes.Count; j++)
|
||||
{
|
||||
var box1 = boxes[i];
|
||||
var box2 = boxes[j];
|
||||
var distance = box1.DistanceTo(box2);
|
||||
pairs.Add((box1, box2, distance));
|
||||
}
|
||||
}
|
||||
|
||||
return pairs;
|
||||
}
|
||||
|
||||
private sealed class Network
|
||||
{
|
||||
public readonly List<JunctionBox> Boxes = [];
|
||||
}
|
||||
|
||||
private sealed record JunctionBox(long X, long Y, long Z)
|
||||
{
|
||||
public Network? Network { get; set; }
|
||||
|
||||
public long DistanceTo(JunctionBox other)
|
||||
{
|
||||
var dx = X - other.X;
|
||||
var dy = Y - other.Y;
|
||||
var dz = Z - other.Z;
|
||||
return dx * dx + dy * dy + dz * dz;
|
||||
}
|
||||
|
||||
public bool ConnectTo(JunctionBox other)
|
||||
{
|
||||
if (BothNotInNetwork())
|
||||
{
|
||||
var newNetwork = new Network();
|
||||
newNetwork.Boxes.Add(this);
|
||||
newNetwork.Boxes.Add(other);
|
||||
Network = newNetwork;
|
||||
other.Network = newNetwork;
|
||||
}
|
||||
else if (OnlyOtherInNetwork())
|
||||
{
|
||||
other.Network!.Boxes.Add(this);
|
||||
Network = other.Network;
|
||||
}
|
||||
else if (OnlyThisInNetwork())
|
||||
{
|
||||
Network!.Boxes.Add(other);
|
||||
other.Network = Network;
|
||||
}
|
||||
else if (NotInSameNetwork())
|
||||
{
|
||||
var target = Network!.Boxes.Count >= other.Network!.Boxes.Count ? Network : other.Network!;
|
||||
var source = target == Network ? other.Network! : Network;
|
||||
|
||||
var sourceBoxes = new List<JunctionBox>(source.Boxes);
|
||||
source.Boxes.Clear();
|
||||
|
||||
foreach (var box in sourceBoxes)
|
||||
{
|
||||
box.Network = target;
|
||||
target.Boxes.Add(box);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Already connected
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
bool BothNotInNetwork() => Network is null && other.Network is null;
|
||||
bool OnlyThisInNetwork() => Network is not null && other.Network is null;
|
||||
bool OnlyOtherInNetwork() => Network is null && other.Network is not null;
|
||||
bool BothInNetwork() => Network is not null && other.Network is not null;
|
||||
bool NotInSameNetwork() => BothInNetwork() && Network != other.Network;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue