private static ProgramPathCollection <int> Part0(string input) { var paths = new ProgramPathCollection <int>(); foreach (var line in input.Lines()) { var words = line.Words().ToList(); var key = words[0].ToInt(); var cdr = words.Skip(2).Select(x => x.Trim(',')).ToInts(); paths.AddPath(key, cdr); } return(paths); }
private static HashSet <int> GetGroupFor(ProgramPathCollection <int> paths, HashSet <int> seen, int key) { seen.Add(key); foreach (var i in paths.GetValue(key)) { if (seen.Contains(i)) { continue; } foreach (var h in GetGroupFor(paths, seen, i)) { seen.TryAdd(h); } } return(seen); }
private static IList <HashSet <int> > GetGroups(ProgramPathCollection <int> paths) { var response = new List <HashSet <int> >(); IList <int> left = new List <int>(); var seen = new HashSet <int>(); do { var hash = GetGroupFor(paths, new HashSet <int>(), left.FirstOrDefault()); seen.UnionWith(hash); response.Add(hash); left = paths.Paths.Where(x => !seen.Contains(x)).ToList(); } while (left.Count > 0); return(response); }