private static void DoCycle(ConwayGrid3D grid) { var comparer = new ArrayByValueComparer(); int nbActives = grid.PointsAndValues().Where(x => x.Value.before).Count(); Console.WriteLine($"Actives : {nbActives}, Size: [{string.Join(",", grid.Size)}]"); var minIndex = grid.MinKeys.Select(x => x - 1).ToArray(); var maxIndex = grid.MaxKeys.Select(x => x + 1).ToArray(); foreach (var point in grid.PointsAndValues(minIndex, maxIndex)) { var nbActiveNeihbors = 0; foreach (var neighbor in grid.AreaSquareAround(point.Key, 1)) { if (neighbor.Value.before && !comparer.Equals(point.Key, neighbor.Key)) { nbActiveNeihbors++; } } if (point.Value.before) { grid[point.Key] = (point.Value.before, nbActiveNeihbors.Between(2, 3)); } else { grid[point.Key] = (point.Value.before, nbActiveNeihbors == 3); } } }
//----------------------------------------------------------------- public override long Part1(string input) { var inputGrid = InputParser.ParseBoolGrid(input, '\n', '#'); ConwayGrid3D grid = GenerateGrid(inputGrid); for (int i = 0; i < 6; i++) { DoCycle(grid); foreach (var point in grid.PointsAndValues(grid.MinKeys, grid.MaxKeys)) { grid[point.Key] = (grid[point.Key].after, false); } } var nbActives = grid.PointsAndValues().Where(x => x.Value.before).Count(); Console.WriteLine($"Actives : {nbActives}"); return(nbActives); }