private bool TryAlignProbes(Point3Set leftSet, Point3Set rightSet, out NearbyScanner match) { foreach (Orientation3 orientation in Enum.GetValues(typeof(Orientation3))) { Point3Set rightSetOriented = rightSet.Orient(orientation); foreach (Point3 leftPoint in leftSet) { foreach (Point3 rightPoint in rightSetOriented) { Point3 offset = leftPoint - rightPoint; Point3Set temp = rightSetOriented.Shift(offset); temp.IntersectWith(leftSet); if (temp.Count >= 12) { match = new NearbyScanner(new Scanner(rightSetOriented), offset); return(true); } } } } match = null; return(false); }
private List <Point3Set> ReadInputFromFile() { List <Point3Set> list = new List <Point3Set>(); Point3Set set = null; foreach (string line in File.ReadAllLines("Day19Input.txt")) { if (line.StartsWith("---")) { set = new Point3Set(); } else if (string.IsNullOrWhiteSpace(line)) { list.Add(set); set = null; } else { int[] parts = line.Split(',').Select(int.Parse).ToArray(); set.Add(new Point3(parts[0], parts[1], parts[2])); } } list.Add(set); return(list); }
private static void MergeHelper(Scanner merged, Scanner current, Point3 offset) { foreach (NearbyScanner nearby in current.NearbyScanners) { Point3 totalOffset = nearby.Offset + offset; Point3Set shift = nearby.Scanner.Probes.Shift(totalOffset); merged.Probes.UnionWith(shift); MergeHelper(merged, nearby.Scanner, totalOffset); } }
public Scanner(Point3Set probes) { Probes = probes; NearbyScanners = new List <NearbyScanner>(); }