Refactor Day08 to rename variables and extract CreateCircuits method for clarity

This commit is contained in:
Sebastian Lindemeier 2025-12-08 11:26:31 +01:00
parent 36d7a3f4e5
commit a3ac176602
1 changed files with 28 additions and 32 deletions

View File

@ -22,12 +22,10 @@ public class Day08
public long SolvePart1(string pathToPuzzleInput, int amountToConnect) public long SolvePart1(string pathToPuzzleInput, int amountToConnect)
{ {
var points = ParsePuzzleInput(pathToPuzzleInput); var jBoxes = ParsePuzzleInput(pathToPuzzleInput);
var jBoxPairs = GetAllCombinationsSortedByDistance(jBoxes);
var pointPairs = GetAllCombinationsSortedByDistance(points); var circuits = CreateCircuits(jBoxes);
circuits = CombineCircuits(circuits, jBoxPairs, amountToConnect);
var circuits = CombineCircuits(amountToConnect, points, pointPairs);
return circuits return circuits
.Select(circuit => circuit.Count) .Select(circuit => circuit.Count)
.OrderDescending() .OrderDescending()
@ -35,44 +33,42 @@ public class Day08
.Aggregate((acc, next) => acc * next); .Aggregate((acc, next) => acc * next);
} }
private List<List<Coordinate>> CreateCircuits(Coordinate[] jBoxes)
{
return jBoxes.Select(p => new List<Coordinate> { p }).ToList();
}
public long SolvePart2(string pathToPuzzleInput) public long SolvePart2(string pathToPuzzleInput)
{ {
var points = ParsePuzzleInput(pathToPuzzleInput); var jBoxes = ParsePuzzleInput(pathToPuzzleInput);
var jBoxPairs = GetAllCombinationsSortedByDistance(jBoxes);
var pointPairs = GetAllCombinationsSortedByDistance(points); var circuits = CreateCircuits(jBoxes);
var lastConnected = LastCombinedConnectAllCircuits(circuits, jBoxPairs);
var lastConnected = LastCombinedConnectAllCircuits(points, pointPairs);
return lastConnected.a.x * lastConnected.b.x; return lastConnected.a.x * lastConnected.b.x;
} }
private List<List<Coordinate>> CombineCircuits(int amountToConnect, Coordinate[] points, private List<List<Coordinate>> CombineCircuits(List<List<Coordinate>> circuits,
(Coordinate pointA, Coordinate pointB)[] pointPairs) (Coordinate boxA, Coordinate boxB)[] jBoxPairs, int amountToConnect)
{ {
var circuits = points.Select(p => new List<Coordinate>() { p }).ToList();
for (var i = 0; i < amountToConnect; i++) for (var i = 0; i < amountToConnect; i++)
{ {
var nextToConnect = pointPairs[i]; var nextToConnect = jBoxPairs[i];
circuits = AddToCircuits(nextToConnect.pointA, nextToConnect.pointB, circuits); circuits = ConnectJBoxes(nextToConnect.boxA, nextToConnect.boxB, circuits);
} }
return circuits; return circuits;
} }
private (Coordinate a, Coordinate b) LastCombinedConnectAllCircuits(Coordinate[] points, private (Coordinate a, Coordinate b) LastCombinedConnectAllCircuits(List<List<Coordinate>> circuits,
(Coordinate pointA, Coordinate pointB)[] pointPairs) (Coordinate boxA, Coordinate boxB)[] jBoxPairs)
{ {
var circuits = points.Select(p => new List<Coordinate>() { p }).ToList(); foreach (var jBoxPair in jBoxPairs)
var lastConnected = pointPairs.First();
var i = 0;
while(circuits.Count > 1)
{ {
var nextToConnect = pointPairs[i++]; circuits = ConnectJBoxes(jBoxPair.boxA, jBoxPair.boxB, circuits);
circuits = AddToCircuits(nextToConnect.pointA, nextToConnect.pointB, circuits); if(circuits.Count <= 1)
lastConnected = nextToConnect; return jBoxPair;
} }
return jBoxPairs[^1];
return lastConnected;
} }
private double GetDistance(Coordinate a, Coordinate b) private double GetDistance(Coordinate a, Coordinate b)
@ -80,7 +76,7 @@ public class Day08
return Math.Sqrt(Math.Pow(a.x - b.x, 2) + Math.Pow(a.y - b.y, 2) + Math.Pow(a.z - b.z, 2)); return Math.Sqrt(Math.Pow(a.x - b.x, 2) + Math.Pow(a.y - b.y, 2) + Math.Pow(a.z - b.z, 2));
} }
private List<List<Coordinate>> AddToCircuits(Coordinate a, Coordinate b, List<List<Coordinate>> circuits) private List<List<Coordinate>> ConnectJBoxes(Coordinate a, Coordinate b, List<List<Coordinate>> circuits)
{ {
var circuitToAddBTo = circuits.First(circuit => circuit.Contains(a)); var circuitToAddBTo = circuits.First(circuit => circuit.Contains(a));
var circuitToAddATo = circuits.First(circuit => circuit.Contains(b)); var circuitToAddATo = circuits.First(circuit => circuit.Contains(b));
@ -95,15 +91,15 @@ public class Day08
return circuits; return circuits;
} }
private (Coordinate pointA, Coordinate pointB)[] GetAllCombinationsSortedByDistance(Coordinate[] coordinates) private (Coordinate boxA, Coordinate boxB)[] GetAllCombinationsSortedByDistance(Coordinate[] jBoxes)
{ {
var combinations = Combinations(coordinates) var combinations = Combinations(jBoxes)
.OrderBy(x => GetDistance(x.a, x.b)) .OrderBy(x => GetDistance(x.a, x.b))
.ToArray(); .ToArray();
return combinations; return combinations;
} }
private IEnumerable<(TValue a, TValue b)> Combinations<TValue>(IEnumerable<TValue> values) where TValue:IComparable private IEnumerable<(TValue a, TValue b)> Combinations<TValue>(IEnumerable<TValue> values)
{ {
var enumeratedValues = values.Index().ToArray(); var enumeratedValues = values.Index().ToArray();
var pairs = var pairs =