Refactor Day08 to rename variables and extract CreateCircuits method for clarity
This commit is contained in:
parent
36d7a3f4e5
commit
a3ac176602
|
|
@ -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 =
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue