private static IReadOnlySet <Point> FlipTiles(IReadOnlySet <Point> tiles) { var newTiles = new HashSet <Point>(); var neighbours = CalculateNeighbours(tiles); foreach (var tile in tiles) { var allNeighbours = neighbours[tile]; var activeNeighbours = allNeighbours.Intersect(tiles).Count(); if (activeNeighbours != 0 && activeNeighbours <= 2) { newTiles.Add(tile); } } foreach (var tile in neighbours.SelectMany(x => x.Value).Distinct().Except(tiles)) { if (tiles.Count(tile.IsNeighbour) == 2) { newTiles.Add(tile); } } return(newTiles); }