public Day21Pattern[][] BreakIntoSquares() { var eachSquareSize = (Size % 2 == 0 ? 2 : 3); Day21Pattern[][] squares = new Day21Pattern[Size / eachSquareSize][]; for (int i = 0; i < Size / eachSquareSize; i++) { squares[i] = new Day21Pattern[Size / eachSquareSize]; for (int j = 0; j < Size / eachSquareSize; j++) { bool[][] thisSquarePattern = new bool[eachSquareSize][]; for (int k = 0; k < eachSquareSize; k++) { thisSquarePattern[k] = new bool[eachSquareSize]; for (int l = 0; l < eachSquareSize; l++) { thisSquarePattern[k][l] = Pattern[i * eachSquareSize + k][j * eachSquareSize + l]; } squares[i][j] = new Day21Pattern(thisSquarePattern); } } } return(squares); }
public Day21Pattern EnhancePattern(Day21Pattern pattern) { var encodedPatterns = new[] { pattern.ToEncodedPattern(), pattern.FlipHorizontal().ToEncodedPattern(), pattern.FlipHorizontal().RotateLeft().ToEncodedPattern(), pattern.FlipVertical().RotateRight().ToEncodedPattern(), pattern.FlipVertical().RotateLeft().ToEncodedPattern(), pattern.FlipHorizontal().RotateRight().ToEncodedPattern(), pattern.FlipVertical().ToEncodedPattern(), pattern.RotateLeft().ToEncodedPattern(), pattern.RotateLeft().RotateLeft().ToEncodedPattern(), pattern.RotateRight().ToEncodedPattern() }; foreach (var encodedPattern in encodedPatterns) { if (rules.ContainsKey(encodedPattern)) { return(new Day21Pattern(rules[encodedPattern])); } } throw new InvalidOperationException("Oops, found no matching rule! Something went wrong..."); }
public int Solve() { var pattern = new Day21Pattern(); var ruleBook = new Day21RuleBook(Input); for (int i = 0; i < 18; i++) { Console.WriteLine(pattern); Console.WriteLine("======="); var nextPatterns = pattern.BreakIntoSquares(); var enhancedPatterns = nextPatterns.Select(patternRow => patternRow.Select(p => ruleBook.EnhancePattern(p)).ToArray()).ToArray(); var combinedPattern = new Day21Pattern(enhancedPatterns); pattern = combinedPattern; } Console.WriteLine(pattern); return(pattern.CountOnPixels()); //240 too high, bother. 210 still too high; I must have misunderstood something as order of rotation / flipping seems to matter. 206 also wrong }