private static void joinDigitsIntoNumbers(List <ColorPattern> patterns) { for (var i = 0; i < patterns.Count(); i++) { for (var j = 0; j < patterns.Count(); j++) { var p1 = patterns[i]; var p2 = patterns[j]; for (var pi = 0; pi < p1.Points.Count(); pi++) { for (var pj = 0; pj < p2.Points.Count(); pj++) { var pt1 = p1.Points[pi]; var pt2 = p2.Points[pj]; if (pt1.IsEmpty || pt2.IsEmpty) { continue; } if (i == j && pi == pj) { continue; } if (pt1.Y == pt2.Y && pt2.X > pt1.X && pt2.X - pt1.X - p1.Pattern.GetLength(1) <= 4 && p1.Value == "1") { var exPat = patterns.FirstOrDefault(p => p.Value == p1.Value + p2.Value); if (exPat == null) { exPat = new ColorPattern { Value = p1.Value + p2.Value, Pattern = new bool[p1.Pattern.GetLength(0), pt2.X + p2.Pattern.GetLength(1) - pt1.X] }; patterns.Add(exPat); } exPat.Points.Add(pt1); p1.Points[pi] = Point.Empty; p2.Points[pj] = Point.Empty; } } } } } foreach (var pattern in patterns) { pattern.Points.RemoveAll(p => p.IsEmpty); } }
private static void addToPatterns(List <ColorPattern> patterns, List <Point> points) { var minX = int.MaxValue; var maxX = int.MinValue; var minY = int.MaxValue; var maxY = int.MinValue; foreach (var point in points) { if (minX > point.X) { minX = point.X; } if (maxX < point.X) { maxX = point.X; } if (minY > point.Y) { minY = point.Y; } if (maxY < point.Y) { maxY = point.Y; } } var pattern = new bool[maxY - minY + 1, maxX - minX + 1]; foreach (var point in points) { pattern[point.Y - minY, point.X - minX] = true; } var existingPattern = patterns.FirstOrDefault(p => Util.PatternEquals(pattern, p.Pattern)); if (existingPattern == null) { existingPattern = new ColorPattern { Pattern = pattern }; patterns.Add(existingPattern); } existingPattern.Points.Add(new Point(minX, minY)); }