about summary refs log tree commit diff
path: root/Day07.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Day07.cs')
-rw-r--r--Day07.cs67
1 files changed, 67 insertions, 0 deletions
diff --git a/Day07.cs b/Day07.cs
new file mode 100644
index 0000000..f26b8a6
--- /dev/null
+++ b/Day07.cs
@@ -0,0 +1,67 @@
+using System.Collections.Generic;
+using System.Linq;
+using aoc2019.lib;
+
+namespace aoc2019
+{
+    internal sealed class Day07 : Day
+    {
+        private readonly IntCodeVM[] Amplifiers = new IntCodeVM[5];
+
+        public Day07() : base(7, "Amplification Circuit")
+        {
+            for (var i = 0; i < 5; i++) Amplifiers[i] = new IntCodeVM(Input.First());
+        }
+
+        protected override string Part1()
+        {
+            long i, largest = 0;
+
+            foreach (var phaseSeq in Enumerable.Range(0, 5).Permute())
+            {
+                i = 0;
+                foreach (var (vm, phase) in Amplifiers.Zip(phaseSeq))
+                {
+                    vm.Reset();
+                    vm.Run(phase, i);
+                    i = vm.Result;
+                }
+
+                if (i > largest)
+                    largest = i;
+            }
+
+            return $"{largest}";
+        }
+
+        protected override string Part2()
+        {
+            long i, largest = 0;
+
+            foreach (var phaseSeq in Enumerable.Range(5, 5).Permute())
+            {
+                i = 0;
+                foreach (var (vm, phase) in Amplifiers.Zip(phaseSeq))
+                {
+                    vm.Reset();
+                    vm.AddInput(phase);
+                }
+
+                var vms = new Queue<IntCodeVM>(Amplifiers);
+                while (vms.Count > 0)
+                {
+                    var vm = vms.Dequeue();
+                    var haltType = vm.Run(i);
+                    if (haltType == IntCodeVM.HaltType.Waiting)
+                        vms.Enqueue(vm);
+                    i = vm.Result;
+                }
+
+                if (i > largest)
+                    largest = i;
+            }
+
+            return $"{largest}";
+        }
+    }
+}
\ No newline at end of file