public void Execute() { var path1 = new WirePath(Input1).BuildStepByStepPath().Zip(Enumerable.Range(1, int.MaxValue), (p, i) => (id: 1, idx: i, p)).ToList(); var path2 = new WirePath(Input2).BuildStepByStepPath().Zip(Enumerable.Range(1, int.MaxValue), (p, i) => (id: 2, idx: i, p)).ToList(); var comparer = new LoggingComparer(); path1.Intersect(path2, comparer).ToList(); Intersections = comparer.Log; ResultMinDistance = Intersections.Min(x => x.Item1.p.ManhattanDistanceToOrigin); ResultMinSteps = Intersections.Min(x => x.Item1.idx + x.Item2.idx); Display = GetDisplay(path1.Select(x => x.p), path2.Select(x => x.p)); }