// Find monsters by rotating/flipping until some are found // Rotate the monster instead of the map, as it's cheaper static bool FindWaterRoughness(char[,] map, char[,] monster, ref int roughness) { var mapw = map.GetLength(0); var maph = map.GetLength(1); var monw = monster.GetLength(0); var monh = monster.GetLength(1); var xscan = mapw - monw; var yscan = maph - monh; var monsterspots = monster.PositionsOf('#'); var monsters = 0; // Scan map for occurrences of the monster (don't care about overlaps) for (var x = 0; x < xscan; x++) { for (var y = 0; y < yscan; y++) { if (monsterspots.All(p => map[x + p.X, y + p.Y] == '#')) { monsters++; } } } if (monsters == 0) { return(false); } roughness = map.CountChar('#') - monsters * monsterspots.Count(); return(true); }