Extract Coordinate, IntegerRange and Coordinate3d to new AdventOfCode.HelperClasses project and refactor solution for modularity and type consistency
This commit is contained in:
+16
-26
@@ -1,11 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.Common;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using AdvenOfCode.Contracts;
|
||||
using AdvenOfCode.Contracts;
|
||||
using AdventOfCode.Extensions;
|
||||
using Coordinate = (long x, long y, long z);
|
||||
using AdventOfCode.HelperClasses;
|
||||
|
||||
namespace AoC_2025;
|
||||
|
||||
@@ -16,12 +11,12 @@ public class Day08 : IPuzzleSolver<long>
|
||||
{
|
||||
_amountToConnect = amountToConnect;
|
||||
}
|
||||
private Coordinate[] ParsePuzzleInput(string path)
|
||||
private Coordinate3d[] ParsePuzzleInput(string path)
|
||||
{
|
||||
var puzzleInput = File.ReadAllLines(path)
|
||||
.Where(line => !string.IsNullOrWhiteSpace(line))
|
||||
.Select(line => line.Split(',', StringSplitOptions.RemoveEmptyEntries).Select(str => long.Parse(str)).ToArray())
|
||||
.Select(numbers => (numbers[0], numbers[1], numbers[2]))
|
||||
.Select(numbers => new Coordinate3d(numbers[0], numbers[1], numbers[2]))
|
||||
.ToArray();
|
||||
return puzzleInput;
|
||||
}
|
||||
@@ -42,16 +37,16 @@ public class Day08 : IPuzzleSolver<long>
|
||||
var jBoxPairs = GetAllCombinationsSortedByDistance(jBoxes);
|
||||
var circuits = CreateCircuits(jBoxes);
|
||||
var lastConnected = LastCombinedConnectAllCircuits(circuits, jBoxPairs);
|
||||
return lastConnected.a.x * lastConnected.b.x;
|
||||
return lastConnected.a.X * lastConnected.b.X;
|
||||
}
|
||||
|
||||
private List<HashSet<Coordinate>> CreateCircuits(IEnumerable<Coordinate> jBoxes)
|
||||
private List<HashSet<Coordinate3d>> CreateCircuits(IEnumerable<Coordinate3d> jBoxes)
|
||||
{
|
||||
return jBoxes.Select(p => new HashSet<Coordinate> { p }).ToList();
|
||||
return jBoxes.Select(p => new HashSet<Coordinate3d> { p }).ToList();
|
||||
}
|
||||
|
||||
private List<HashSet<Coordinate>> CombineCircuits(List<HashSet<Coordinate>> circuits,
|
||||
IEnumerable<(Coordinate boxA, Coordinate boxB)> jBoxPairs, int amountToConnect)
|
||||
private List<HashSet<Coordinate3d>> CombineCircuits(List<HashSet<Coordinate3d>> circuits,
|
||||
IEnumerable<(Coordinate3d boxA, Coordinate3d boxB)> jBoxPairs, int amountToConnect)
|
||||
{
|
||||
circuits = jBoxPairs
|
||||
.Take(amountToConnect)
|
||||
@@ -59,8 +54,8 @@ public class Day08 : IPuzzleSolver<long>
|
||||
return circuits;
|
||||
}
|
||||
|
||||
private (Coordinate a, Coordinate b) LastCombinedConnectAllCircuits(List<HashSet<Coordinate>> circuits,
|
||||
IEnumerable<(Coordinate boxA, Coordinate boxB)> jBoxPairs)
|
||||
private (Coordinate3d a, Coordinate3d b) LastCombinedConnectAllCircuits(List<HashSet<Coordinate3d>> circuits,
|
||||
IEnumerable<(Coordinate3d boxA, Coordinate3d boxB)> jBoxPairs)
|
||||
{
|
||||
foreach (var jBoxPair in jBoxPairs)
|
||||
{
|
||||
@@ -68,15 +63,10 @@ public class Day08 : IPuzzleSolver<long>
|
||||
if(circuits.Count <= 1)
|
||||
return jBoxPair;
|
||||
}
|
||||
return ((0,0,0), (0,0,0));
|
||||
return (new(0,0,0), new(0,0,0));
|
||||
}
|
||||
|
||||
private long GetDistance(Coordinate a, Coordinate b)
|
||||
{
|
||||
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y) + (a.z - b.z) * (a.z - b.z);
|
||||
}
|
||||
|
||||
private List<HashSet<Coordinate>> ConnectJBoxes(Coordinate a, Coordinate b, List<HashSet<Coordinate>> circuits)
|
||||
private List<HashSet<Coordinate3d>> ConnectJBoxes(Coordinate3d a, Coordinate3d b, List<HashSet<Coordinate3d>> circuits)
|
||||
{
|
||||
var circuitToAddBTo = circuits.First(circuit => circuit.Contains(a));
|
||||
var circuitToAddATo = circuits.First(circuit => circuit.Contains(b));
|
||||
@@ -91,15 +81,15 @@ public class Day08 : IPuzzleSolver<long>
|
||||
return circuits;
|
||||
}
|
||||
|
||||
private IEnumerable<(Coordinate boxA, Coordinate boxB)> GetAllCombinationsSortedByDistance(IEnumerable<Coordinate> jBoxes)
|
||||
private IEnumerable<(Coordinate3d boxA, Coordinate3d boxB)> GetAllCombinationsSortedByDistance(IEnumerable<Coordinate3d> jBoxes)
|
||||
{
|
||||
var combinations = jBoxes.Combinations(2)
|
||||
.Select(x => (a: x[0], b: x[1]))
|
||||
.OrderBy(x => GetDistance(x.a, x.b));
|
||||
.OrderBy(x => Coordinate3d.GetEuclidianDistance(x.a, x.b));
|
||||
return combinations;
|
||||
}
|
||||
|
||||
private long MultiplyLargestCircuitLength(List<HashSet<Coordinate>> circuits, int amountMultiply)
|
||||
private long MultiplyLargestCircuitLength(List<HashSet<Coordinate3d>> circuits, int amountMultiply)
|
||||
{
|
||||
return circuits
|
||||
.Select(circuit => (long)circuit.Count)
|
||||
|
||||
Reference in New Issue
Block a user