public override Output Part1() { var input = Input.Lines(); var grid = new SparsePlaneGrid2D <int>(input[0].Length, input.Length); for (int y = 0; y < input.Length; y++) { for (int x = 0; x < input[y].Length; x++) { grid[x, y] = Int32.Parse(input[y][x].ToString()) + 1; } } List <Coordinate2D> flashes = new(); long answer = 0; for (int i = 0; i < 100; i++) { flashes.Clear(); for (int y = 0; y < grid.J.Length; y++) { for (int x = 0; x < grid.I.Length; x++) { Increase(x, y); } } } void Increase(long x, long y) { if (flashes.Contains(new(x, y))) { return; } grid[x, y]++; if (grid[x, y] == 11) { answer++; grid[x, y] = 1; if (!flashes.Contains(new(x, y))) { flashes.Add(new(x, y)); var ns = grid.Neighbors(new(x, y)); foreach (var n in ns) { Increase(n.X, n.Y); } } } } return(answer); }
public override Output Part2() { var input = Input.Paragraphs(); var algorithm = input[0].Replace("\n", ""); var imageData = input[1].Lines(); var grid = new SparsePlaneGrid2D <bool>(); for (int y = 0; y < imageData.Length; y++) { for (int x = 0; x < imageData[y].Length; x++) { grid[x, y] = imageData[y][x] == '#'; } } var x0 = 0; var xN = imageData[0].Length; var y0 = 0; var yN = imageData.Length; for (int t = 0; t < 50; t++) { x0--; xN++; y0--; yN++; var newDefault = (grid.DefaultValue ? algorithm.Last() : algorithm.First()) == '#'; var newGrid = new SparsePlaneGrid2D <bool>(newDefault); for (var y = y0; y <= yN; y++) { for (var x = x0; x <= xN; x++) { var rule = 0; rule = rule * 2 + (grid[x - 1, y - 1] ? 1 : 0); rule = rule * 2 + (grid[x, y - 1] ? 1 : 0); rule = rule * 2 + (grid[x + 1, y - 1] ? 1 : 0); rule = rule * 2 + (grid[x - 1, y] ? 1 : 0); rule = rule * 2 + (grid[x, y] ? 1 : 0); rule = rule * 2 + (grid[x + 1, y] ? 1 : 0); rule = rule * 2 + (grid[x - 1, y + 1] ? 1 : 0); rule = rule * 2 + (grid[x, y + 1] ? 1 : 0); rule = rule * 2 + (grid[x + 1, y + 1] ? 1 : 0); newGrid[x, y] = algorithm[rule] == '#'; } } grid = newGrid; } return(grid.Count(x => x.Value)); }
private void Draw(SparsePlaneGrid2D <char> grid) { Console.Clear(); for (int y = 0; y < grid.J.Length; y++) { for (int x = 0; x < grid.I.Length; x++) { Console.Write(grid[x, y]); } Console.WriteLine(); } }
private void Print(SparsePlaneGrid2D <int> grid) { Console.Clear(); for (int y = 0; y < grid.J.Length; y++) { for (int x = 0; x < grid.I.Length; x++) { var v = grid[x, y] - 1; if (v == 0) { Console.ForegroundColor = ConsoleColor.Cyan; } Console.Write(v); Console.ResetColor(); } Console.WriteLine(); } }
public override Output Part1() { var input = Input.Lines(); var grid = new SparsePlaneGrid2D <char>(new Interval(0, input[0].Length, true), new Interval(0, input.Length, true)); for (int y = 0; y < input.Length; y++) { for (int x = 0; x < input[0].Length; x++) { grid[x, y] = input[y][x]; } } var t = 0; while (true) { t++; Console.WriteLine(t); int moved = 0; var newGrid = new SparsePlaneGrid2D <char>(new Interval(0, input[0].Length, true), new Interval(0, input.Length, true)); for (int y = 0; y < input.Length; y++) { for (int x = 0; x < input[0].Length; x++) { newGrid[x, y] = grid[x, y]; } } for (int y = input.Length - 1; y >= 0; y--) { for (int x = input[0].Length - 1; x >= 0; x--) { if (grid[x, y] == '>' && grid[x + 1, y] == '.') { newGrid[x, y] = '.'; newGrid[x + 1, y] = '>'; moved++; } } } for (int y = 0; y < input.Length; y++) { for (int x = 0; x < input[0].Length; x++) { grid[x, y] = newGrid[x, y]; } } for (int y = input.Length - 1; y >= 0; y--) { for (int x = input[0].Length - 1; x >= 0; x--) { if (grid[x, y] == 'v' && grid[x, y + 1] == '.') { newGrid[x, y] = '.'; newGrid[x, y + 1] = 'v'; moved++; } } } if (moved == 0) { return(t); } grid = newGrid; } }