void Main() { var points = File .ReadAllLines(Path.Combine(Path.GetDirectoryName(Util.CurrentQueryPath), @"25_input.txt")) .Select(p => p.Split(',').Select(q => int.Parse(q.Trim())).ToArray()) .ToList(); var constellations = new List>(); while(points.Any()) { var p = points.First(); points.RemoveAt(0); constellations.Add(Constell(p, points).ToList()); } //constellations.Select(c => c.Select(q => string.Join(" ; ", q))).Dump(); constellations.Count().Dump(); } IEnumerable Constell(int[] p, List points) { yield return p; for(;;) { var f=false; for (int i = 0; i < points.Count; i++) { if (Dist(p, points[i]) <= 3) { var np = points[i]; points.RemoveAt(i); foreach (var p2 in Constell(np, points)) yield return p2; f=true; break; } } if (!f) yield break; } } int Dist(int[] a, int[] b) => Math.Abs(a[0] - b[0]) + Math.Abs(a[1] - b[1]) + Math.Abs(a[2] - b[2]) + Math.Abs(a[3] - b[3]);