public void Run2(int days = 10) { Run(); // start to execute days of flipping for (int day = 1; day <= days; day++) { // Any black tile with zero or more than 2 black tiles immediately adjacent to it is flipped to white. // Any white tile with exactly 2 black tiles immediately adjacent to it is flipped to black. foreach (var(ind, tile) in TilesVisited) { var adjacent = AdjacentTiles(tile); var blackAdjacent = adjacent.Where((item) => !item.White).Count(); if (tile.White && blackAdjacent == 2) { // exactly 2 black tiles, flip to black! tile.FlipTo = false; } else if (!tile.White && (blackAdjacent == 0 || blackAdjacent > 2)) { tile.FlipTo = true; } } foreach (var(ind, tile) in NewTiles) { TilesVisited.Add(tile.Index, tile); var adjacent = AdjacentTiles(tile, false); var blackAdjacent = adjacent.Where((item) => !item.White).Count(); if (tile.White && blackAdjacent == 2) { // exactly 2 black tiles, flip to black! tile.FlipTo = false; } else if (!tile.White && (blackAdjacent == 0 || blackAdjacent > 2)) { tile.FlipTo = true; } } foreach (var(ind, tile) in TilesVisited) { tile.ExecuteFlip(); } NewTiles = new Dictionary <string, Tile>(); var nr = CountBlackTiles(); // Console.WriteLine($"Day {day}: {nr}"); } }