private static Position[,] SimulateRound(Position[,] before, int numberWhenPeopleLeave, Func <Position[, ], int, int, int> numberOfAdjacents) { Position[,] after = before.Clone() as Position[, ]; for (int i = 0; i < before.GetLength(0); ++i) { for (int j = 0; j < before.GetLength(1); ++j) { if (before[i, j] == Position.Floor) { continue; } int adjacents = numberOfAdjacents(before, i, j); if (adjacents >= numberWhenPeopleLeave) { after[i, j] = Position.Empty; } if (adjacents == 0) { after[i, j] = Position.Occupied; } } } return(after); }
private static int CalculateResult1(Position[,] input, int numberWhenPeopleLeave, Func <Position[, ], int, int, int> numberOfAdjacents) { Position[,] before = input.Clone() as Position[, ]; Position[,] after = input.Clone() as Position[, ]; //Console.WriteLine("start"); //PrintPosition(before); //Console.WriteLine(); do { before = after.Clone() as Position[, ]; after = SimulateRound(before, numberWhenPeopleLeave, numberOfAdjacents); //Console.WriteLine("before"); //PrintPosition(before); //Console.WriteLine("after"); //PrintPosition(after); //Console.WriteLine(); } while (!PositionsEqual(before, after)); return(after.Cast <Position>().Count(p => p == Position.Occupied)); }