about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBen Harris <ben@tilde.team>2020-12-16 18:06:36 -0500
committerBen Harris <ben@tilde.team>2020-12-16 18:06:36 -0500
commitcb10768fa14c4b6ec19d050e13a0c3e00c152874 (patch)
tree2da56b45700f5dd1bde994cbeae04f18424a17c3
parent837527d487c7e232b36dd87c95a15b7852f2e057 (diff)
move project to subdirectory and add unit testing
day 13 is removed from the test so it doesn't take 4 years
-rw-r--r--.drone.yml9
-rw-r--r--aoc2019.sln16
-rw-r--r--aoc2019.test/Tests.cs56
-rw-r--r--aoc2019.test/aoc2019.test.csproj20
-rw-r--r--aoc2019/Day.cs (renamed from Day.cs)4
-rw-r--r--aoc2019/Day01.cs (renamed from Day01.cs)6
-rw-r--r--aoc2019/Day02.cs (renamed from Day02.cs)6
-rw-r--r--aoc2019/Day03.cs (renamed from Day03.cs)6
-rw-r--r--aoc2019/Day04.cs (renamed from Day04.cs)6
-rw-r--r--aoc2019/Day05.cs (renamed from Day05.cs)6
-rw-r--r--aoc2019/Day06.cs (renamed from Day06.cs)6
-rw-r--r--aoc2019/Day07.cs (renamed from Day07.cs)6
-rw-r--r--aoc2019/Day08.cs (renamed from Day08.cs)6
-rw-r--r--aoc2019/Day09.cs (renamed from Day09.cs)6
-rw-r--r--aoc2019/Day10.cs (renamed from Day10.cs)6
-rw-r--r--aoc2019/Day11.cs (renamed from Day11.cs)6
-rw-r--r--aoc2019/Day12.cs (renamed from Day12.cs)6
-rw-r--r--aoc2019/Day13.cs (renamed from Day13.cs)6
-rw-r--r--aoc2019/Day14.cs (renamed from Day14.cs)6
-rw-r--r--aoc2019/Day15.cs (renamed from Day15.cs)6
-rw-r--r--aoc2019/Day16.cs (renamed from Day16.cs)6
-rw-r--r--aoc2019/Day17.cs (renamed from Day17.cs)6
-rw-r--r--aoc2019/Program.cs (renamed from Program.cs)62
-rw-r--r--aoc2019/README.md (renamed from README.md)0
-rw-r--r--aoc2019/aoc2019.csproj (renamed from aoc2019.csproj)28
-rw-r--r--aoc2019/input/day01.in (renamed from input/day01.in)0
-rw-r--r--aoc2019/input/day02.in (renamed from input/day02.in)0
-rw-r--r--aoc2019/input/day03.in (renamed from input/day03.in)0
-rw-r--r--aoc2019/input/day04.in (renamed from input/day04.in)0
-rw-r--r--aoc2019/input/day05.in (renamed from input/day05.in)0
-rw-r--r--aoc2019/input/day06.in (renamed from input/day06.in)0
-rw-r--r--aoc2019/input/day07.in (renamed from input/day07.in)0
-rw-r--r--aoc2019/input/day08.in (renamed from input/day08.in)0
-rw-r--r--aoc2019/input/day09.in (renamed from input/day09.in)0
-rw-r--r--aoc2019/input/day10.in (renamed from input/day10.in)0
-rw-r--r--aoc2019/input/day11.in (renamed from input/day11.in)0
-rw-r--r--aoc2019/input/day12.in (renamed from input/day12.in)0
-rw-r--r--aoc2019/input/day13.in (renamed from input/day13.in)0
-rw-r--r--aoc2019/input/day14.in (renamed from input/day14.in)0
-rw-r--r--aoc2019/input/day15.in (renamed from input/day15.in)0
-rw-r--r--aoc2019/input/day16.in (renamed from input/day16.in)0
-rw-r--r--aoc2019/input/day17.in (renamed from input/day17.in)0
-rw-r--r--aoc2019/input/day18.in (renamed from input/day18.in)0
-rw-r--r--aoc2019/input/day19.in (renamed from input/day19.in)0
-rw-r--r--aoc2019/input/day20.in (renamed from input/day20.in)0
-rw-r--r--aoc2019/input/day21.in (renamed from input/day21.in)0
-rw-r--r--aoc2019/input/day22.in (renamed from input/day22.in)0
-rw-r--r--aoc2019/input/day23.in (renamed from input/day23.in)0
-rw-r--r--aoc2019/input/day24.in (renamed from input/day24.in)0
-rw-r--r--aoc2019/input/day25.in (renamed from input/day25.in)0
-rw-r--r--aoc2019/lib/Extensions.cs (renamed from lib/Extensions.cs)0
-rw-r--r--aoc2019/lib/IntCodeVM.cs (renamed from lib/IntCodeVM.cs)0
52 files changed, 190 insertions, 107 deletions
diff --git a/.drone.yml b/.drone.yml
index 42c62bb..09bd08f 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -3,7 +3,8 @@ kind: pipeline
 name: run
 
 steps:
-    - name: run
-      image: mcr.microsoft.com/dotnet/sdk:latest
-      commands:
-          - dotnet run
+  - name: run
+    image: mcr.microsoft.com/dotnet/sdk:latest
+    commands:
+      - dotnet test
+      - dotnet run --project aoc2019/aoc2019.csproj
diff --git a/aoc2019.sln b/aoc2019.sln
index fe311d7..29afd37 100644
--- a/aoc2019.sln
+++ b/aoc2019.sln
@@ -3,7 +3,9 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 16
 VisualStudioVersion = 16.0.29519.181
 MinimumVisualStudioVersion = 10.0.40219.1
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aoc2019", "aoc2019.csproj", "{0F1DADD9-2DC3-4035-BE2A-1CC9BBB623A9}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "aoc2019", "aoc2019\aoc2019.csproj", "{D99F8F27-0CF3-4220-95F5-B8F92D02F17D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "aoc2019.test", "aoc2019.test\aoc2019.test.csproj", "{D168189E-28FC-440F-B64C-02C6D9FBBEE0}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -11,10 +13,14 @@ Global
 		Release|Any CPU = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{0F1DADD9-2DC3-4035-BE2A-1CC9BBB623A9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{0F1DADD9-2DC3-4035-BE2A-1CC9BBB623A9}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{0F1DADD9-2DC3-4035-BE2A-1CC9BBB623A9}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{0F1DADD9-2DC3-4035-BE2A-1CC9BBB623A9}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D99F8F27-0CF3-4220-95F5-B8F92D02F17D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D99F8F27-0CF3-4220-95F5-B8F92D02F17D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D99F8F27-0CF3-4220-95F5-B8F92D02F17D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D99F8F27-0CF3-4220-95F5-B8F92D02F17D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D168189E-28FC-440F-B64C-02C6D9FBBEE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D168189E-28FC-440F-B64C-02C6D9FBBEE0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D168189E-28FC-440F-B64C-02C6D9FBBEE0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D168189E-28FC-440F-B64C-02C6D9FBBEE0}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/aoc2019.test/Tests.cs b/aoc2019.test/Tests.cs
new file mode 100644
index 0000000..48706a8
--- /dev/null
+++ b/aoc2019.test/Tests.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Diagnostics;
+using aoc2019;
+using aoc2019.lib;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace aoc2019.test
+{
+    [TestClass]
+    public class Tests
+    {
+        [DataTestMethod]
+        [DataRow(typeof(Day01), "3394106", "5088280")]
+        [DataRow(typeof(Day02), "3085697", "9425")]
+        [DataRow(typeof(Day03), "1195", "91518")]
+        [DataRow(typeof(Day04), "1079", "699")]
+        [DataRow(typeof(Day05), "7692125", "14340395")]
+        [DataRow(typeof(Day06), "145250", "274")]
+        [DataRow(typeof(Day07), "19650", "35961106")]
+        [DataRow(typeof(Day08), "2413", "xxx   xx  xxx  xxxx xxx  \r\nx  x x  x x  x    x x  x \r\nxxx  x    x  x   x  xxx  \r\nx  x x    xxx   x   x  x \r\nx  x x  x x    x    x  x \r\nxxx   xx  x    xxxx xxx  ")]
+        [DataRow(typeof(Day09), "3409270027", "82760")]
+        [DataRow(typeof(Day10), "260", "608")]
+        [DataRow(typeof(Day11), "2054", " #  # ###  #### ####  ##    ## #  # ###    \r\n # #  #  #    # #    #  #    # #  # #  #   \r\n ##   #  #   #  ###  #  #    # #### ###    \r\n # #  ###   #   #    ####    # #  # #  #   \r\n # #  # #  #    #    #  # #  # #  # #  #   \r\n #  # #  # #### #### #  #  ##  #  # ###    ")]
+        [DataRow(typeof(Day12), "10635", "583523031727256")]
+        [DataRow(typeof(Day13), "361", "after 7133 moves, the score is: 17590")]
+        [DataRow(typeof(Day14), "397771", "3126714")]
+        [DataRow(typeof(Day15), "280", "400")]
+        [DataRow(typeof(Day16), "90744714", "82994322")]
+        [DataRow(typeof(Day17), "2804", "")]
+        public void TestAllDays(Type dayType, string part1, string part2)
+        {
+            // create day instance
+            var s = Stopwatch.StartNew();
+            var day = (Day) Activator.CreateInstance(dayType);
+            s.Stop();
+            Assert.IsNotNull(day, "failed to create day object");
+            Console.WriteLine($"{s.ScaleMilliseconds()}ms elapsed in constructor");
+
+            // part 1
+            s.Reset();
+            s.Start();
+            var part1Actual = day.Part1();
+            s.Stop();
+            Console.WriteLine($"{s.ScaleMilliseconds()}ms elapsed in part1");
+            Assert.AreEqual(part1, part1Actual, $"Incorrect answer for Day {day.DayNumber} Part1");
+
+            // part 2
+            s.Reset();
+            s.Start();
+            var part2Actual = day.Part2();
+            s.Stop();
+            Console.WriteLine($"{s.ScaleMilliseconds()}ms elapsed in part2");
+            Assert.AreEqual(part2, part2Actual, $"Incorrect answer for Day {day.DayNumber} Part2");
+        }
+    }
+}
diff --git a/aoc2019.test/aoc2019.test.csproj b/aoc2019.test/aoc2019.test.csproj
new file mode 100644
index 0000000..f3b9de8
--- /dev/null
+++ b/aoc2019.test/aoc2019.test.csproj
@@ -0,0 +1,20 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>net5.0</TargetFramework>
+
+    <IsPackable>false</IsPackable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
+    <PackageReference Include="MSTest.TestAdapter" Version="2.1.1" />
+    <PackageReference Include="MSTest.TestFramework" Version="2.1.1" />
+    <PackageReference Include="coverlet.collector" Version="1.3.0" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\aoc2019\aoc2019.csproj" />
+  </ItemGroup>
+
+</Project>
diff --git a/Day.cs b/aoc2019/Day.cs
index eb3ef49..e1bdb25 100644
--- a/Day.cs
+++ b/aoc2019/Day.cs
@@ -43,7 +43,7 @@ namespace aoc2019
             Console.WriteLine();
         }
 
-        protected abstract string Part1();
-        protected abstract string Part2();
+        public abstract string Part1();
+        public abstract string Part2();
     }
 }
\ No newline at end of file
diff --git a/Day01.cs b/aoc2019/Day01.cs
index d991917..6ebdce5 100644
--- a/Day01.cs
+++ b/aoc2019/Day01.cs
@@ -3,7 +3,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day01 : Day
+    public sealed class Day01 : Day
     {
         private readonly IEnumerable<int> masses;
 
@@ -30,12 +30,12 @@ namespace aoc2019
             return total;
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             return $"{masses.Sum(FuelCost)}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             return $"{masses.Sum(FullCost)}";
         }
diff --git a/Day02.cs b/aoc2019/Day02.cs
index 3a79970..ce99a0a 100644
--- a/Day02.cs
+++ b/aoc2019/Day02.cs
@@ -3,7 +3,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day02 : Day
+    public sealed class Day02 : Day
     {
         private readonly IEnumerable<int> input;
 
@@ -28,12 +28,12 @@ namespace aoc2019
             return v[0];
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             return $"{RunIntCode(12, 2)}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             for (var i = 0; i < 100; i++)
             for (var j = 0; j < 100; j++)
diff --git a/Day03.cs b/aoc2019/Day03.cs
index e339c27..bf32fb3 100644
--- a/Day03.cs
+++ b/aoc2019/Day03.cs
@@ -4,7 +4,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day03 : Day
+    public sealed class Day03 : Day
     {
         private readonly IEnumerable<(int, int)> intersections;
         private readonly List<Dictionary<(int, int), int>> wires;
@@ -15,12 +15,12 @@ namespace aoc2019
             intersections = wires[0].Keys.Intersect(wires[1].Keys);
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             return $"{intersections.Min(x => Math.Abs(x.Item1) + Math.Abs(x.Item2))}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             // add 2 to count (0, 0) on both lines
             return $"{intersections.Min(x => wires[0][x] + wires[1][x]) + 2}";
diff --git a/Day04.cs b/aoc2019/Day04.cs
index f4ddcf9..808eb64 100644
--- a/Day04.cs
+++ b/aoc2019/Day04.cs
@@ -2,7 +2,7 @@
 
 namespace aoc2019
 {
-    internal sealed class Day04 : Day
+    public sealed class Day04 : Day
     {
         private readonly int end;
 
@@ -36,12 +36,12 @@ namespace aoc2019
             return IsValid(i) && s.Select(c => s.Count(j => j == c)).Any(c => c == 2);
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             return $"{Enumerable.Range(start, end).Count(IsValid)}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             return $"{Enumerable.Range(start, end).Count(HasOnePair)}";
         }
diff --git a/Day05.cs b/aoc2019/Day05.cs
index 763d0f8..2020627 100644
--- a/Day05.cs
+++ b/aoc2019/Day05.cs
@@ -3,7 +3,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day05 : Day
+    public sealed class Day05 : Day
     {
         private readonly IEnumerable<int> tape;
 
@@ -63,13 +63,13 @@ namespace aoc2019
             }
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             RunIntCode(tape.ToList(), 1);
             return $"{output}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             RunIntCode(tape.ToList(), 5);
             return $"{output}";
diff --git a/Day06.cs b/aoc2019/Day06.cs
index 7ef3d0a..ede02da 100644
--- a/Day06.cs
+++ b/aoc2019/Day06.cs
@@ -3,7 +3,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day06 : Day
+    public sealed class Day06 : Day
     {
         private readonly Dictionary<string, string> input;
 
@@ -21,12 +21,12 @@ namespace aoc2019
             return res;
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             return $"{input.Keys.Sum(o => GetParents(o).Count - 1)}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             var you = GetParents("YOU");
             var san = GetParents("SAN");
diff --git a/Day07.cs b/aoc2019/Day07.cs
index f26b8a6..10684b9 100644
--- a/Day07.cs
+++ b/aoc2019/Day07.cs
@@ -4,7 +4,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day07 : Day
+    public sealed class Day07 : Day
     {
         private readonly IntCodeVM[] Amplifiers = new IntCodeVM[5];
 
@@ -13,7 +13,7 @@ namespace aoc2019
             for (var i = 0; i < 5; i++) Amplifiers[i] = new IntCodeVM(Input.First());
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             long i, largest = 0;
 
@@ -34,7 +34,7 @@ namespace aoc2019
             return $"{largest}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             long i, largest = 0;
 
diff --git a/Day08.cs b/aoc2019/Day08.cs
index 94cd461..ea8f587 100644
--- a/Day08.cs
+++ b/aoc2019/Day08.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day08 : Day
+    public sealed class Day08 : Day
     {
         private readonly List<List<char>> photo;
 
@@ -14,13 +14,13 @@ namespace aoc2019
             photo = Input.First().Chunk(25 * 6).Select(s => s.ToList()).ToList();
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             var l = photo.OrderBy(layer => layer.Count(pixel => pixel == '0')).First();
             return $"{l.Count(p => p == '1') * l.Count(p => p == '2')}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             return Enumerable.Range(0, 25 * 6)
                 .Select(p => Enumerable.Range(0, photo.Count)
diff --git a/Day09.cs b/aoc2019/Day09.cs
index 0f45dfd..d5edd0a 100644
--- a/Day09.cs
+++ b/aoc2019/Day09.cs
@@ -3,7 +3,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day09 : Day
+    public sealed class Day09 : Day
     {
         private readonly IntCodeVM vm;
 
@@ -12,14 +12,14 @@ namespace aoc2019
             vm = new IntCodeVM(Input.First());
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             vm.Reset();
             vm.Run(1);
             return $"{vm.output.ToDelimitedString(",")}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             vm.Reset();
             vm.Run(2);
diff --git a/Day10.cs b/aoc2019/Day10.cs
index 376e427..6151e54 100644
--- a/Day10.cs
+++ b/aoc2019/Day10.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day10 : Day
+    public sealed class Day10 : Day
     {
         private readonly HashSet<(int x, int y)> asteroids;
         private (int x, int y) best = (x: -1, y: -1);
@@ -21,7 +21,7 @@ namespace aoc2019
                 .ToHashSet();
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             foreach (var asteroid in asteroids)
             {
@@ -41,7 +41,7 @@ namespace aoc2019
             return $"{bestCanSee}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             static IEnumerable<(int x, int y, double angle, double dist)> GetValue(
                 Queue<(int x, int y, double angle, double dist)> q)
diff --git a/Day11.cs b/aoc2019/Day11.cs
index e45f6ce..bce7cce 100644
--- a/Day11.cs
+++ b/aoc2019/Day11.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day11 : Day
+    public sealed class Day11 : Day
     {
         private readonly IntCodeVM vm;
         private Direction heading;
@@ -78,12 +78,12 @@ namespace aoc2019
             return map;
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             return $"{PaintShip(0).Count}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             var map = PaintShip(1);
             var minX = (int) map.Keys.Select(x => x.x).Min();
diff --git a/Day12.cs b/aoc2019/Day12.cs
index 312c705..04e215e 100644
--- a/Day12.cs
+++ b/aoc2019/Day12.cs
@@ -4,7 +4,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day12 : Day
+    public sealed class Day12 : Day
     {
         private readonly List<Position> moons;
         private int step;
@@ -48,7 +48,7 @@ namespace aoc2019
             step++;
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             while (step < 1000)
                 Step();
@@ -56,7 +56,7 @@ namespace aoc2019
             return $"{moons.Sum(p => p.TotalEnergy)}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             int cycleX = 0, cycleY = 0, cycleZ = 0;
 
diff --git a/Day13.cs b/aoc2019/Day13.cs
index 4dff712..4d919e7 100644
--- a/Day13.cs
+++ b/aoc2019/Day13.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day13 : Day
+    public sealed class Day13 : Day
     {
         private readonly Dictionary<(int x, int y), int> board;
 
@@ -52,14 +52,14 @@ namespace aoc2019
             }
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             vm.Reset();
             vm.Run();
             return $"{vm.output.Where((v, i) => (i + 1) % 3 == 0 && v == 2).Count()}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             vm.Reset();
             vm.memory[0] = 2;
diff --git a/Day14.cs b/aoc2019/Day14.cs
index a73a858..af7af42 100644
--- a/Day14.cs
+++ b/aoc2019/Day14.cs
@@ -4,7 +4,7 @@ using System.Linq;
 
 namespace aoc2019
 {
-    internal sealed class Day14 : Day
+    public sealed class Day14 : Day
     {
         private readonly Dictionary<string, Reaction> reactions;
 
@@ -48,14 +48,14 @@ namespace aoc2019
             return true;
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             available = new Dictionary<string, long> {{"ORE", long.MaxValue}};
             Consume("FUEL", 1);
             return $"{long.MaxValue - available["ORE"]}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             const long capacity = 1_000_000_000_000;
             available = new Dictionary<string, long> {{"ORE", capacity}};
diff --git a/Day15.cs b/aoc2019/Day15.cs
index 0b2ca88..59d720c 100644
--- a/Day15.cs
+++ b/aoc2019/Day15.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day15 : Day
+    public sealed class Day15 : Day
     {
         private readonly bool verbose = false;
         private readonly IntCodeVM vm;
@@ -15,7 +15,7 @@ namespace aoc2019
             vm = new IntCodeVM(Input.First());
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             vm.Reset();
             var currentLocation = new Location(0, 0);
@@ -109,7 +109,7 @@ namespace aoc2019
             return "";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             var changed = true;
             while (changed)
diff --git a/Day16.cs b/aoc2019/Day16.cs
index e2958bd..310363a 100644
--- a/Day16.cs
+++ b/aoc2019/Day16.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day16 : Day
+    public sealed class Day16 : Day
     {
         private static readonly int[] BasePattern = {0, 1, 0, -1};
         private readonly int[] initialList;
@@ -15,7 +15,7 @@ namespace aoc2019
             initialList = Input.First().Select(c => int.Parse($"{c}")).ToArray();
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             const int phaseCount = 100;
             var signal0 = initialList.ToArray();
@@ -29,7 +29,7 @@ namespace aoc2019
                     .ToArray());
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             const int phaseCount = 100;
             var messageOffset = initialList.Take(7).Aggregate((n, i) => n * 10 + i);
diff --git a/Day17.cs b/aoc2019/Day17.cs
index 2438ee9..557881e 100644
--- a/Day17.cs
+++ b/aoc2019/Day17.cs
@@ -5,7 +5,7 @@ using aoc2019.lib;
 
 namespace aoc2019
 {
-    internal sealed class Day17 : Day
+    public sealed class Day17 : Day
     {
         private const bool Verbose = false;
 
@@ -16,7 +16,7 @@ namespace aoc2019
             vm = new IntCodeVM(Input.First());
         }
 
-        protected override string Part1()
+        public override string Part1()
         {
             vm.Reset();
             vm.Run();
@@ -39,7 +39,7 @@ namespace aoc2019
             return $"{sum}";
         }
 
-        protected override string Part2()
+        public override string Part2()
         {
             //vm.Reset();
             //vm.memory[0] = 2;
diff --git a/Program.cs b/aoc2019/Program.cs
index 4338952..c523439 100644
--- a/Program.cs
+++ b/aoc2019/Program.cs
@@ -1,32 +1,32 @@
-using System;

-using System.Linq;

-using System.Reflection;

-

-namespace aoc2019

-{

-    internal static class Program

-    {

-        private static void Main(string[] args)

-        {

-            var days =

-                Assembly.GetExecutingAssembly().GetTypes()

-                    .Where(t => t.BaseType == typeof(Day))

-                    .Select(t => (Day) Activator.CreateInstance(t))

-                    .OrderBy(d => d.DayNumber);

-

-            if (args.Length == 1 && int.TryParse(args[0], out var dayNum))

-            {

-                var day = days.FirstOrDefault(d => d.DayNumber == dayNum);

-

-                if (day != null)

-                    day.AllParts();

-                else

-                    Console.WriteLine($"{dayNum} invalid or not yet implemented");

-            }

-            else

-            {

-                foreach (var d in days) d.AllParts();

-            }

-        }

-    }

+using System;
+using System.Linq;
+using System.Reflection;
+
+namespace aoc2019
+{
+    internal static class Program
+    {
+        private static void Main(string[] args)
+        {
+            var days =
+                Assembly.GetExecutingAssembly().GetTypes()
+                    .Where(t => t.BaseType == typeof(Day))
+                    .Select(t => (Day) Activator.CreateInstance(t))
+                    .OrderBy(d => d.DayNumber);
+
+            if (args.Length == 1 && int.TryParse(args[0], out var dayNum))
+            {
+                var day = days.FirstOrDefault(d => d.DayNumber == dayNum);
+
+                if (day != null)
+                    day.AllParts();
+                else
+                    Console.WriteLine($"{dayNum} invalid or not yet implemented");
+            }
+            else
+            {
+                foreach (var d in days) d.AllParts();
+            }
+        }
+    }
 }
\ No newline at end of file
diff --git a/README.md b/aoc2019/README.md
index 0e6fdc8..0e6fdc8 100644
--- a/README.md
+++ b/aoc2019/README.md
diff --git a/aoc2019.csproj b/aoc2019/aoc2019.csproj
index eaa667f..494194f 100644
--- a/aoc2019.csproj
+++ b/aoc2019/aoc2019.csproj
@@ -1,14 +1,14 @@
-<Project Sdk="Microsoft.NET.Sdk">

-

-  <PropertyGroup>

-    <OutputType>Exe</OutputType>

-    <TargetFramework>net5.0</TargetFramework>

-  </PropertyGroup>

-

-  <ItemGroup>

-    <None Update="input\day*.in">

-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

-    </None>

-  </ItemGroup>

-

-</Project>

+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net5.0</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <None Update="input\day*.in">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
+</Project>
diff --git a/input/day01.in b/aoc2019/input/day01.in
index fb4481d..fb4481d 100644
--- a/input/day01.in
+++ b/aoc2019/input/day01.in
diff --git a/input/day02.in b/aoc2019/input/day02.in
index c3ac93e..c3ac93e 100644
--- a/input/day02.in
+++ b/aoc2019/input/day02.in
diff --git a/input/day03.in b/aoc2019/input/day03.in
index d8a6b32..d8a6b32 100644
--- a/input/day03.in
+++ b/aoc2019/input/day03.in
diff --git a/input/day04.in b/aoc2019/input/day04.in
index 6190bcb..6190bcb 100644
--- a/input/day04.in
+++ b/aoc2019/input/day04.in
diff --git a/input/day05.in b/aoc2019/input/day05.in
index 4d8fafe..4d8fafe 100644
--- a/input/day05.in
+++ b/aoc2019/input/day05.in
diff --git a/input/day06.in b/aoc2019/input/day06.in
index 2868a3f..2868a3f 100644
--- a/input/day06.in
+++ b/aoc2019/input/day06.in
diff --git a/input/day07.in b/aoc2019/input/day07.in
index 0128ef0..0128ef0 100644
--- a/input/day07.in
+++ b/aoc2019/input/day07.in
diff --git a/input/day08.in b/aoc2019/input/day08.in
index 9100e5b..9100e5b 100644
--- a/input/day08.in
+++ b/aoc2019/input/day08.in
diff --git a/input/day09.in b/aoc2019/input/day09.in
index 0e05ddc..0e05ddc 100644
--- a/input/day09.in
+++ b/aoc2019/input/day09.in
diff --git a/input/day10.in b/aoc2019/input/day10.in
index bf4ecf6..bf4ecf6 100644
--- a/input/day10.in
+++ b/aoc2019/input/day10.in
diff --git a/input/day11.in b/aoc2019/input/day11.in
index 693f432..693f432 100644
--- a/input/day11.in
+++ b/aoc2019/input/day11.in
diff --git a/input/day12.in b/aoc2019/input/day12.in
index 071ed71..071ed71 100644
--- a/input/day12.in
+++ b/aoc2019/input/day12.in
diff --git a/input/day13.in b/aoc2019/input/day13.in
index bb41b45..bb41b45 100644
--- a/input/day13.in
+++ b/aoc2019/input/day13.in
diff --git a/input/day14.in b/aoc2019/input/day14.in
index 438d38f..438d38f 100644
--- a/input/day14.in
+++ b/aoc2019/input/day14.in
diff --git a/input/day15.in b/aoc2019/input/day15.in
index 79901fe..79901fe 100644
--- a/input/day15.in
+++ b/aoc2019/input/day15.in
diff --git a/input/day16.in b/aoc2019/input/day16.in
index b8d468b..b8d468b 100644
--- a/input/day16.in
+++ b/aoc2019/input/day16.in
diff --git a/input/day17.in b/aoc2019/input/day17.in
index 9b6105d..9b6105d 100644
--- a/input/day17.in
+++ b/aoc2019/input/day17.in
diff --git a/input/day18.in b/aoc2019/input/day18.in
index fe32fb3..fe32fb3 100644
--- a/input/day18.in
+++ b/aoc2019/input/day18.in
diff --git a/input/day19.in b/aoc2019/input/day19.in
index 1d8e0c8..1d8e0c8 100644
--- a/input/day19.in
+++ b/aoc2019/input/day19.in
diff --git a/input/day20.in b/aoc2019/input/day20.in
index 0047b8a..0047b8a 100644
--- a/input/day20.in
+++ b/aoc2019/input/day20.in
diff --git a/input/day21.in b/aoc2019/input/day21.in
index 48e194e..48e194e 100644
--- a/input/day21.in
+++ b/aoc2019/input/day21.in
diff --git a/input/day22.in b/aoc2019/input/day22.in
index f7a54bc..f7a54bc 100644
--- a/input/day22.in
+++ b/aoc2019/input/day22.in
diff --git a/input/day23.in b/aoc2019/input/day23.in
index 67fd867..67fd867 100644
--- a/input/day23.in
+++ b/aoc2019/input/day23.in
diff --git a/input/day24.in b/aoc2019/input/day24.in
index 5126c4f..5126c4f 100644
--- a/input/day24.in
+++ b/aoc2019/input/day24.in
diff --git a/input/day25.in b/aoc2019/input/day25.in
index b060a82..b060a82 100644
--- a/input/day25.in
+++ b/aoc2019/input/day25.in
diff --git a/lib/Extensions.cs b/aoc2019/lib/Extensions.cs
index eb8c3cb..eb8c3cb 100644
--- a/lib/Extensions.cs
+++ b/aoc2019/lib/Extensions.cs
diff --git a/lib/IntCodeVM.cs b/aoc2019/lib/IntCodeVM.cs
index 2190579..2190579 100644
--- a/lib/IntCodeVM.cs
+++ b/aoc2019/lib/IntCodeVM.cs