about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Harris <ben@tilde.team>2021-12-08 11:32:37 -0500
committerBen Harris <ben@tilde.team>2021-12-08 11:32:37 -0500
commitd38a4e70c83f0f374834f3dd13229a3d4924177c (patch)
treece28cb3922243a5c6141503ec4edc2f826a2b691
parent1673962a7238c7c3c7b4bef5d3be84717f3fa6ad (diff)
finish d8p2
-rw-r--r--aoc2021/Day08.cs35
1 files changed, 25 insertions, 10 deletions
diff --git a/aoc2021/Day08.cs b/aoc2021/Day08.cs
index 054d9c5..86e764b 100644
--- a/aoc2021/Day08.cs
+++ b/aoc2021/Day08.cs
@@ -8,12 +8,11 @@ public sealed class Day08 : Day
     private static readonly List<char[]> PossibleMappings = "abcdefg".ToCharArray().Permute().Select(m => m.ToArray()).ToList();
     public Day08() : base(8, "Seven Segment Search")
     {
-        UseTestInput = true;
     }
 
-    private static int MatchDigit(char[] lit)
+    private static int MatchDigit(string lit)
     {
-        return new string(lit) switch
+        return lit switch
         {
             "1110111" => 0,
             "0010010" => 1,
@@ -33,31 +32,47 @@ public sealed class Day08 : Day
     {
         var s = line.Split(" | ").Select(s => s.Split(' ')).ToList();
         int i;
+        char[] lit;
         for (i = 0; i < PossibleMappings.Count; i++)
         {
-            var lit = "0000000".ToCharArray();
-            var matches = new int[10];
+            var matches = 0;
             var failed = false;
             foreach (var signal in s[0])
             {
+                lit = "0000000".ToCharArray();
                 foreach (var c in signal)
                     lit[Array.IndexOf(PossibleMappings[i], c)] = '1';
                 
-                var match = MatchDigit(lit);
+                var match = MatchDigit(new(lit));
                 if (match == -1)
                 {
                     failed = true;
                     break;
                 }
-                matches[match] = 1;
+
+                matches++;
             }
 
             if (failed) continue;
-            if (matches.All(m => m == 1)) break;
+            if (matches == 10) break;
+        }
+
+        if (i == PossibleMappings.Count)
+        {
+            throw new("no mapping found");
+        }
+
+        var digits = new StringBuilder();
+        foreach (var o in s[1])
+        {
+            lit = "0000000".ToCharArray();
+            foreach (var c in o)
+                lit[Array.IndexOf(PossibleMappings[i], c)] = '1';
+            
+            digits.Append(MatchDigit(new(lit)));
         }
 
-        var mapping = PossibleMappings[i];
-        return 1;
+        return int.Parse(digits.ToString());
     }
 
     public override string Part1() =>