public static void PartOne() { string input = InputHelper.GetInputFromFile("6"); IEnumerable <(string Orbitee, string Orbiter)> orbits = input.Split("\r\n").Select(line => { var parts = line.Split(")"); return(parts[0], parts[1]); }); OrbitTree tree = new OrbitTree(); Queue <Orbitable> orbitablesToProcess = new Queue <Orbitable>(); orbitablesToProcess.Enqueue(tree.CenterOfMass); while (orbitablesToProcess.Count() > 0) { Orbitable currentOrbitable = orbitablesToProcess.Dequeue(); var orbiters = orbits.Where(o => o.Orbitee == currentOrbitable.Code).Select(o => o.Orbiter); foreach (string orbiterCode in orbiters) { Orbitable orbitable = new Orbitable(orbiterCode, currentOrbitable); currentOrbitable.Orbiters.Add(orbitable); orbitablesToProcess.Enqueue(orbitable); } } //Display(tree.CenterOfMass); Console.WriteLine($"Weight : {Weight(tree.CenterOfMass)}"); }
private static int GetDistanceBetween(OrbitTree tree, Orbitable me, Orbitable santa) { int distanceUp = 0; Orbitable link = me.Orbitee; IEnumerable <Orbitable> reachables = Flatten(link); while (!reachables.Contains(santa)) { link = link.Orbitee; reachables = Flatten(link); distanceUp++; } return(distanceUp + DistanceDownTo(link, santa)); }
public static void PartTwo() { string input = InputHelper.GetInputFromFile("6"); IEnumerable <(string Orbitee, string Orbiter)> orbits = input.Split("\r\n").Select(line => { var parts = line.Split(")"); return(parts[0], parts[1]); }); OrbitTree tree = new OrbitTree(); Queue <Orbitable> orbitablesToProcess = new Queue <Orbitable>(); orbitablesToProcess.Enqueue(tree.CenterOfMass); Orbitable me = null, santa = null; while (orbitablesToProcess.Count() > 0) { Orbitable currentOrbitable = orbitablesToProcess.Dequeue(); var orbiters = orbits.Where(o => o.Orbitee == currentOrbitable.Code).Select(o => o.Orbiter); foreach (string orbiterCode in orbiters) { Orbitable orbitable = new Orbitable(orbiterCode, currentOrbitable); if (orbiterCode == "YOU") { me = orbitable; } if (orbiterCode == "SAN") { santa = orbitable; } currentOrbitable.Orbiters.Add(orbitable); orbitablesToProcess.Enqueue(orbitable); } } //Display(tree.CenterOfMass); int distanceBetween = GetDistanceBetween(tree, me, santa); Console.WriteLine($"Distance: {distanceBetween}"); }