public static void PartOne() { List <string> lines = Utils.GetLinesFromFile("input/Day17Input.txt"); List <Tuple <int, int> > clay = new List <Tuple <int, int> >(); foreach (string line in lines) { string[] coords = line.Split(", "); int firstValue = Convert.ToInt32(coords[0].Substring(2)); string[] range = coords[1].Split(".."); int secondStart = Convert.ToInt32(range[0].Substring(2)); int secondEnd = Convert.ToInt32(range[1]); for (int i = secondStart; i <= secondEnd; i++) { Tuple <int, int> newClay; if (line.StartsWith("y")) { newClay = new Tuple <int, int>(i, firstValue); } else { newClay = new Tuple <int, int>(firstValue, i); } clay.Add(newClay); } } int minX = clay.Select(x => x.Item1).Min() - 1; int maxX = clay.Select(x => x.Item1).Max() + 1; int minY = clay.Select(x => x.Item2).Min(); int maxY = clay.Select(x => x.Item2).Max(); GridContents[,] grid = new GridContents[maxY + 1, maxX - minX + 1]; foreach (Tuple <int, int> item in clay) { SetAt(grid, item.Item1 - minX, item.Item2, GridContents.Clay); } FillWithWaterFrom(grid, 500 - minX, minY - 1); int total = 0; for (int currentY = 0; currentY < grid.GetLength(0); currentY++) { for (int currentX = 0; currentX < grid.GetLength(1); currentX++) { switch (grid[currentY, currentX]) { case GridContents.None: break; case GridContents.Clay: break; case GridContents.UnsettledWater: total++; break; case GridContents.SettledWater: total++; break; } } } Console.WriteLine("We can make {0} squares of water", total); }
public static void SetAt(GridContents[,] grid, int x, int y, GridContents value) { grid[y, x] = value; }
public void UpdatePointOfInterest(GridReference reference, GridContents newContent) { PointAtLocation(reference).Contents = newContent; }
public static void FillWithWaterFrom(GridContents[,] grid, int x, int y) { for (int currentY = findFloor(grid, x, y); currentY > y; currentY--) { bool wallsOnBothSides = true; SetAt(grid, x, currentY, GridContents.UnsettledWater); if (currentY == grid.GetLength(0) - 1 || GetAt(grid, x, currentY + 1) == GridContents.UnsettledWater) { continue; } int leftWall = 0; int rightWall = 0; int currentX = x; while (true) { currentX--; GridContents contents = GetAt(grid, currentX, currentY); if (contents == GridContents.Clay) { leftWall = currentX; break; } else { SetAt(grid, currentX, currentY, GridContents.UnsettledWater); if (GetAt(grid, currentX, currentY + 1) == GridContents.None) { FillWithWaterFrom(grid, currentX, currentY); if (GetAt(grid, currentX, currentY + 1) == GridContents.UnsettledWater) { wallsOnBothSides = false; break; } } } } currentX = x; while (true) { currentX++; GridContents contents = GetAt(grid, currentX, currentY); if (contents == GridContents.Clay) { rightWall = currentX; break; } else { SetAt(grid, currentX, currentY, GridContents.UnsettledWater); if (GetAt(grid, currentX, currentY + 1) == GridContents.None) { FillWithWaterFrom(grid, currentX, currentY); if (GetAt(grid, currentX, currentY + 1) == GridContents.UnsettledWater) { wallsOnBothSides = false; break; } } } } if (wallsOnBothSides) { for (currentX = leftWall + 1; currentX < rightWall; currentX++) { SetAt(grid, currentX, currentY, GridContents.SettledWater); } } } }
public GridReference(int x, int y, GridContents content = GridContents.empty) { ThisX = x; ThisY = y; Contents = content; }