about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Harris <ben@tilde.team>2021-12-08 01:42:15 -0500
committerBen Harris <ben@tilde.team>2021-12-08 01:42:15 -0500
commit1673962a7238c7c3c7b4bef5d3be84717f3fa6ad (patch)
treed36cfd4210d814adcd5304ff2729c4d617b802ce
parent14e8698150f2c2b7e88256d8c6aa6c266dcc9797 (diff)
start d8p2, not working yet
-rw-r--r--aoc2021.test/DayTests.cs2
-rw-r--r--aoc2021/Day08.cs53
-rw-r--r--aoc2021/Extensions.cs8
3 files changed, 61 insertions, 2 deletions
diff --git a/aoc2021.test/DayTests.cs b/aoc2021.test/DayTests.cs
index 3e1cccb..bfd7dc7 100644
--- a/aoc2021.test/DayTests.cs
+++ b/aoc2021.test/DayTests.cs
@@ -49,7 +49,7 @@ public class DayTests
     [DataRow(typeof(Day05), "5", "12")]
     [DataRow(typeof(Day06), "5934", "26984457539")]
     [DataRow(typeof(Day07), "37", "168")]
-    [DataRow(typeof(Day08), "26", "")]
+    [DataRow(typeof(Day08), "26", "61229")]
     public void CheckTestInputs(Type dayType, string part1, string part2)
     {
         Day.UseTestInput = true;
diff --git a/aoc2021/Day08.cs b/aoc2021/Day08.cs
index 553dc97..054d9c5 100644
--- a/aoc2021/Day08.cs
+++ b/aoc2021/Day08.cs
@@ -5,8 +5,59 @@
 /// </summary>
 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)
+    {
+        return new string(lit) switch
+        {
+            "1110111" => 0,
+            "0010010" => 1,
+            "1011101" => 2,
+            "1011011" => 3,
+            "0111010" => 4,
+            "1101011" => 5,
+            "1101111" => 6,
+            "1010010" => 7,
+            "1111111" => 8,
+            "1111011" => 9,
+            _ => -1
+        };
+    }
+
+    private static int Decode(string line)
+    {
+        var s = line.Split(" | ").Select(s => s.Split(' ')).ToList();
+        int i;
+        for (i = 0; i < PossibleMappings.Count; i++)
+        {
+            var lit = "0000000".ToCharArray();
+            var matches = new int[10];
+            var failed = false;
+            foreach (var signal in s[0])
+            {
+                foreach (var c in signal)
+                    lit[Array.IndexOf(PossibleMappings[i], c)] = '1';
+                
+                var match = MatchDigit(lit);
+                if (match == -1)
+                {
+                    failed = true;
+                    break;
+                }
+                matches[match] = 1;
+            }
+
+            if (failed) continue;
+            if (matches.All(m => m == 1)) break;
+        }
+
+        var mapping = PossibleMappings[i];
+        return 1;
     }
 
     public override string Part1() =>
@@ -16,5 +67,5 @@ public sealed class Day08 : Day
             .Sum()
             .ToString();
 
-    public override string Part2() => "";
+    public override string Part2() => Input.Select(Decode).Sum().ToString();
 }
diff --git a/aoc2021/Extensions.cs b/aoc2021/Extensions.cs
index 84587a4..58efece 100644
--- a/aoc2021/Extensions.cs
+++ b/aoc2021/Extensions.cs
@@ -42,4 +42,12 @@ public static class Extensions
 
         return res;
     }
+    
+    public static IEnumerable<IEnumerable<T>> Permute<T>(this IEnumerable<T> list)
+    {
+        var array = list as T[] ?? list.ToArray();
+        return array.Length == 1
+            ? new[] { array }
+            : array.SelectMany(t => Permute(array.Where(x => !x!.Equals(t))), (v, p) => p.Prepend(v));
+    }
 }