diff --git a/advent-of-code-2021.csproj b/advent-of-code-2021.csproj
index 6a8a541..b585d03 100644
--- a/advent-of-code-2021.csproj
+++ b/advent-of-code-2021.csproj
@@ -48,6 +48,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/inputs/11.txt b/inputs/11.txt
new file mode 100644
index 0000000..328ac4f
--- /dev/null
+++ b/inputs/11.txt
@@ -0,0 +1,10 @@
+3265255276
+1537412665
+7335746422
+6426325658
+3854434364
+8717377486
+4522286326
+6337772845
+8824387665
+6351586484
\ No newline at end of file
diff --git a/src/11.cs b/src/11.cs
new file mode 100644
index 0000000..c7cf47c
--- /dev/null
+++ b/src/11.cs
@@ -0,0 +1,142 @@
+namespace aoc2021;
+
+internal class Day11
+{
+ internal static void Go()
+ {
+ Logger.Log("Day 11");
+ Logger.Log("-----");
+
+ var lines = File.ReadAllLines("inputs/11.txt");
+ var grid = new byte[lines.Length, lines[0].Length];
+ for (int i = 0; i < lines.Length; i++)
+ {
+ var line = lines[i];
+ for (int j = 0; j < line.Length; j++)
+ {
+ var num = line[j];
+ grid[i, j] = (byte)char.GetNumericValue(num);
+ }
+ }
+
+ //var gridCopy = new byte[lines.Length, lines[0].Length];
+ //Buffer.BlockCopy(grid, 0, gridCopy, 0, grid.Length);
+
+ Part1(grid);
+ Part2(grid);
+
+ Logger.Log("");
+ }
+
+ private static IEnumerable<(int, int)> Adjacent(byte[,] grid, int i, int j)
+ {
+ if (i > 0)
+ {
+ if (j > 0)
+ {
+ yield return (i - 1, j - 1);
+ }
+ yield return (i - 1, j);
+ if (j < grid.GetLength(1) - 1)
+ {
+ yield return (i - 1, j + 1);
+ }
+ }
+ if (j > 0)
+ {
+ yield return (i, j - 1);
+ }
+ if (j < grid.GetLength(1) - 1)
+ {
+ yield return (i, j + 1);
+ }
+ if (i < grid.GetLength(1) - 1)
+ {
+ if (j > 0)
+ {
+ yield return (i + 1, j - 1);
+ }
+ yield return (i + 1, j);
+ if (j < grid.GetLength(1) - 1)
+ {
+ yield return (i + 1, j + 1);
+ }
+ }
+ }
+
+ private static void Flash(byte[,] grid, int i, int j, List<(int, int)> flashed)
+ {
+ flashed.Add((i, j));
+ foreach (var pt in Adjacent(grid, i, j))
+ {
+ grid[pt.Item1, pt.Item2]++;
+ if (grid[pt.Item1, pt.Item2] == 10)
+ {
+ Flash(grid, pt.Item1, pt.Item2, flashed);
+ }
+ }
+ }
+
+ private static void Part1(byte[,] grid)
+ {
+ using var t = new Timer();
+
+ long numFlashes = 0;
+ for (int step = 0; step < 100; step++)
+ {
+ var flashed = new List<(int, int)>();
+ for (int i = 0; i < grid.GetLength(0); i++)
+ {
+ for (int j = 0; j < grid.GetLength(1); j++)
+ {
+ grid[i, j]++;
+ if (grid[i, j] == 10)
+ {
+ Flash(grid, i, j, flashed);
+ }
+ }
+ }
+
+ foreach (var pt in flashed)
+ {
+ grid[pt.Item1, pt.Item2] = 0;
+ numFlashes++;
+ }
+ }
+
+ Logger.Log($"part1: {numFlashes}");
+ }
+
+ private static void Part2(byte[,] grid)
+ {
+ using var t = new Timer();
+
+ int step = 101;
+ for (; ; step++)
+ {
+ var flashed = new List<(int, int)>();
+ for (int i = 0; i < grid.GetLength(0); i++)
+ {
+ for (int j = 0; j < grid.GetLength(1); j++)
+ {
+ grid[i, j]++;
+ if (grid[i, j] == 10)
+ {
+ Flash(grid, i, j, flashed);
+ }
+ }
+ }
+
+ if (flashed.Count == grid.GetLength(0) * grid.GetLength(1))
+ {
+ break;
+ }
+ foreach (var pt in flashed)
+ {
+ grid[pt.Item1, pt.Item2] = 0;
+ }
+ }
+
+ Logger.Log($"part2: {step}");
+ }
+}
diff --git a/src/main.cs b/src/main.cs
index afd62e0..2915053 100644
--- a/src/main.cs
+++ b/src/main.cs
@@ -33,7 +33,11 @@ switch (arg)
aoc2021.Day09.Go();
break;
- default:
+ case "10":
aoc2021.Day10.Go();
break;
+
+ default:
+ aoc2021.Day11.Go();
+ break;
}