Beispiel #1
0
 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);
     }
 }
Beispiel #2
0
        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));
        }