about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Harris <ben@tilde.team>2020-12-02 22:56:27 -0500
committerBen Harris <ben@tilde.team>2020-12-02 22:56:27 -0500
commit4c8483fe7ab87ae8038c8b49c2f5d98ac99a3fa1 (patch)
treedeace6f206e692a8aa50c744181ebd1de16d43ed
parent449e14d5e25f92029d8a7f6cfb036958f0157744 (diff)
day 16
-rw-r--r--Day15.cs2
-rw-r--r--Day16.cs53
2 files changed, 52 insertions, 3 deletions
diff --git a/Day15.cs b/Day15.cs
index 5195511..367b1fc 100644
--- a/Day15.cs
+++ b/Day15.cs
@@ -8,7 +8,7 @@ namespace aoc2019
     internal sealed class Day15 : Day
     {
         private readonly IntCodeVM vm;
-        private bool verbose = false;
+        private readonly bool verbose = false;
 
         public Day15()
         {
diff --git a/Day16.cs b/Day16.cs
index ce7e7e0..6c90520 100644
--- a/Day16.cs
+++ b/Day16.cs
@@ -1,17 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using aoc2019.lib;
+
 namespace aoc2019
 {
     internal sealed class Day16 : Day
     {
+        private static readonly int[] BasePattern = {0, 1, 0, -1};
+        private readonly int[] initialList;
+
+        public Day16()
+        {
+            initialList = Input.First().Select(c => int.Parse($"{c}")).ToArray();
+        }
+
         public override int DayNumber => 16;
 
         protected override string Part1()
         {
-            return "";
+            const int phaseCount = 100;
+            var signal0 = initialList.ToArray();
+            var signal1 = new int[signal0.Length];
+
+            for (var i = 0; i < phaseCount; i++)
+                CalculateSignal(i % 2 == 0 ? signal0 : signal1, i % 2 == 0 ? signal1 : signal0);
+
+            return new string(
+                signal0.Take(8).Select(c => (char) (c + '0'))
+                    .ToArray());
         }
 
         protected override string Part2()
         {
-            return "";
+            const int phaseCount = 100;
+            var messageOffset = initialList.Take(7).Aggregate((n, i) => n * 10 + i);
+            var signal = initialList.Repeat(10_000).Skip(messageOffset).ToArray();
+
+            for (var p = 0; p < phaseCount; p++)
+            {
+                signal[^1] %= 10;
+                for (var i = signal.Length - 2; i >= 0; i--)
+                    signal[i] = (signal[i + 1] + signal[i]) % 10;
+            }
+
+            return new string(signal.Take(8).Select(c => (char) (c + '0')).ToArray());
+        }
+
+        private static void CalculateSignal(IReadOnlyList<int> input, IList<int> output)
+        {
+            for (var outputIndex = 0; outputIndex < output.Count; outputIndex++)
+                output[outputIndex] =
+                    Math.Abs(PatternValues(outputIndex, input.Count).Select((pv, i) => pv * input[i] % 10).Sum()) % 10;
+        }
+
+        private static IEnumerable<int> PatternValues(int index, int count)
+        {
+            return BasePattern
+                .SelectMany(v => Enumerable.Repeat(v, index + 1))
+                .Repeat(int.MaxValue)
+                .Skip(1)
+                .Take(count);
         }
     }
 }
\ No newline at end of file