Преглед на файлове

Day 13 part 2 - messy AF but working

Lukas Angerer преди 2 години
родител
ревизия
4be1b664f8
променени са 2 файла, в които са добавени 103 реда и са изтрити 3 реда
  1. 70 0
      Day13/Image.cs
  2. 33 3
      Day13/Program.cs

+ 70 - 0
Day13/Image.cs

@@ -52,6 +52,55 @@ public class Image
         } 
         return -1;
     }
+    
+    public int FindFixedFold()
+    {
+        var map = new Dictionary<string, List<int>>();
+        for (var i = 0; i < _lines.Count; i++)
+        {
+            if (!map.ContainsKey(_lines[i]))
+            {
+                map[_lines[i]] = new List<int>();
+            }
+            map[_lines[i]].Add(i + 1);
+        }
+
+        var centers = map
+            .Where(kvp => kvp.Value.Count >= 2)
+            .SelectMany(kvp =>
+                Pairs(kvp.Value.Count)
+                    .Select(p => 
+                        new AxisInfo(
+                            (kvp.Value[p.Left] + kvp.Value[p.Right]) / 2,
+                            Math.Min(kvp.Value[p.Left], kvp.Value[p.Right]),
+                            Math.Max(kvp.Value[p.Left], kvp.Value[p.Right]))
+                    )
+                    .Where(info => (info.Upper - info.Lower) % 2 == 1)
+            ).GroupBy(info => info.Center).ToDictionary(g => g.Key, g => g.ToList());
+
+        if (!centers.ContainsKey(1))
+        {
+            centers.Add(1, new List<AxisInfo>());
+        }
+        
+        if (!centers.ContainsKey(_lines.Count - 1))
+        {
+            centers.Add(_lines.Count - 1, new List<AxisInfo>());
+        }
+
+        foreach (var group in centers)
+        {
+            var toBorder = Math.Min(group.Key, _lines.Count - group.Key);
+            if (group.Value.Count == toBorder - 1)
+            {
+                if (CanFix(group))
+                {
+                    return group.Key;
+                }
+            }
+        } 
+        return -1;
+    }
 
     public Image Rotate()
     {
@@ -71,5 +120,26 @@ public class Image
         }
     }
 
+    private bool CanFix(KeyValuePair<int, List<AxisInfo>> group)
+    {
+        for (var i = 0; i < group.Value.Count + 1; i++)
+        {
+            if (!group.Value.Exists(info => info.Lower == group.Key - i))
+            {
+                if (Distance(_lines[group.Key - i - 1], _lines[group.Key + i]) == 1)
+                {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    private static int Distance(string left, string right)
+    {
+        return left.Zip(right).Count(pair => pair.First != pair.Second);
+    }
+
     private record AxisInfo(int Center, int Lower, int Upper);
 }

+ 33 - 3
Day13/Program.cs

@@ -19,9 +19,13 @@ var parser = new Parser();
 var images = parser.Parse(inputFile).ToList();
 
 var sum = 0;
+var sum2 = 0;
 foreach (var img in images)
 {
+    var img2 = img.Rotate();
+    
     var fold = img.FindFold();
+    
     if (fold > 0)
     {
         img.Print();
@@ -30,15 +34,40 @@ foreach (var img in images)
     }
     else
     {
-        var img2 = img.Rotate();
         fold = img2.FindFold();
         if (fold > 0)
         {
-            img.Print();
+            img2.Print();
             Console.WriteLine($"Rotated (Col): {fold}");
             sum += fold;
         }
-        else
+        
+        if (fold <= 0)
+        {
+            Console.WriteLine("Nope");
+            img.Print();
+            break;
+        }
+    }
+    
+    fold = img.FindFixedFold();
+    if (fold > 0)
+    {
+        img.Print();
+        Console.WriteLine($"FIXED - Original (Row): {fold}");
+        sum2 += 100 * fold;
+    }
+    else
+    {
+        fold = img2.FindFixedFold();
+        if (fold > 0)
+        {
+            img2.Print();
+            Console.WriteLine($"FIXED - Rotated (Col): {fold}");
+            sum2 += fold;
+        }
+
+        if (fold <= 0)
         {
             Console.WriteLine("Nope");
             img.Print();
@@ -49,5 +78,6 @@ foreach (var img in images)
 
 Console.WriteLine();
 Console.WriteLine($"Total: {sum}");
+Console.WriteLine($"Total Fixed: {sum2}");
 
 return 0;