about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Day.cs14
-rw-r--r--Day1.cs21
-rw-r--r--Day2.cs44
-rw-r--r--Day3.cs12
-rw-r--r--Day4.cs24
-rw-r--r--DayFactory.cs19
-rw-r--r--Program.cs30
7 files changed, 63 insertions, 101 deletions
diff --git a/Day.cs b/Day.cs
index c02c37b..e12d7eb 100644
--- a/Day.cs
+++ b/Day.cs
@@ -1,13 +1,17 @@
-namespace aoc2019
+using System;
+
+namespace aoc2019
 {
     public abstract class Day
     {
+        public abstract int DayNumber { get; }
         public virtual void AllParts()
         {
-            Part1();
-            Part2();
+            Console.WriteLine($"Day {DayNumber}:");
+            Console.WriteLine(Part1());
+            Console.WriteLine(Part2());
         }
-        public abstract void Part1();
-        public abstract void Part2();
+        public abstract string Part1();
+        public abstract string Part2();
     }
 }
diff --git a/Day1.cs b/Day1.cs
index 186c7b4..b5d8612 100644
--- a/Day1.cs
+++ b/Day1.cs
@@ -1,4 +1,3 @@
-using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
@@ -7,16 +6,12 @@ namespace aoc2019
 {
     public class Day1 : Day
     {
-        private static readonly IEnumerable<int> lines =
-            File.ReadLines("input/day1.in").Select(line => int.Parse(line));
+        public override int DayNumber => 1;
 
-        private static int FuelCost(int weight) => weight / 3 - 2;
-
-        public override void Part1()
-        {
-            Console.WriteLine(lines.Select(num => FuelCost(num)).Sum());
-        }
+        private static readonly IEnumerable<int> masses =
+            File.ReadLines("input/day1.in").Select(int.Parse);
 
+        private static int FuelCost(int weight) => weight / 3 - 2;
         private static int FullCost(int cost)
         {
             int total = 0, newcost, tmp = cost;
@@ -30,10 +25,8 @@ namespace aoc2019
             return total;
         }
 
-        public override void Part2()
-        {
-            Console.WriteLine(lines.Select(cost => FullCost(cost)).Sum());
-        }
+        public override string Part1() => $"{masses.Select(FuelCost).Sum()}";
+
+        public override string Part2() => $"{masses.Select(FullCost).Sum()}";
     }
 }
-
diff --git a/Day2.cs b/Day2.cs
index 10dc15f..e469bcc 100644
--- a/Day2.cs
+++ b/Day2.cs
@@ -1,4 +1,3 @@
-using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
@@ -7,54 +6,37 @@ namespace aoc2019
 {
     public class Day2 : Day
     {
+        public override int DayNumber => 2;
+
         private static readonly IEnumerable<int> input =
-            File.ReadLines("input/day2.in")
-            .First()
-            .Split(',')
-            .Select(num => int.Parse(num));
+            File.ReadLines("input/day2.in").First().Split(',').Select(int.Parse);
 
-        public static void RunIntCode(ref List<int> v)
+        public static List<int> RunIntCode(int noun, int verb, List<int> v)
         {
+            v[1] = noun; v[2] = verb;
+
             for (var i = 0; v[i] != 99; i += 4)
                 switch (v[i])
                 {
                     case 1: v[v[i + 3]] = v[v[i + 1]] + v[v[i + 2]]; break;
                     case 2: v[v[i + 3]] = v[v[i + 1]] * v[v[i + 2]]; break;
                 }
+            return v;
         }
 
-        public override void Part1()
+        public override string Part1()
         {
-            var output = input.ToList();
-            output[1] = 12;
-            output[2] = 2;
-
-            RunIntCode(ref output);
-
-            Console.WriteLine($"{output[0]}");
+            return $"{RunIntCode(12, 2, input.ToList())[0]}";
         }
 
-        public override void Part2()
+        public override string Part2()
         {
-            List<int> output;
-
             for (var i = 0; i < 100; i++)
-            {
                 for (var j = 0; j < 100; j++)
-                {
-                    output = input.ToList();
-                    output[1] = i;
-                    output[2] = j;
+                    if (RunIntCode(i, j, input.ToList())[0] == 19690720)
+                        return $"{100 * i + j}";
 
-                    RunIntCode(ref output);
-
-                    if (output[0] == 19690720)
-                    {
-                        Console.WriteLine($"{100 * i + j}");
-                        return;
-                    }
-                }
-            }
+            return string.Empty;
         }
     }
 }
diff --git a/Day3.cs b/Day3.cs
index e9cbdca..e3f998f 100644
--- a/Day3.cs
+++ b/Day3.cs
@@ -7,24 +7,26 @@ namespace aoc2019
 {
     internal class Day3 : Day
     {
+        public override int DayNumber => 3;
+
         private readonly IEnumerable<(int, int)> intersections;
         private readonly List<Dictionary<(int, int), int>> wires;
 
         public Day3()
         {
-            wires = File.ReadAllLines("input/day3.in").Select(line => ParseWire(line)).ToList();
+            wires = File.ReadAllLines("input/day3.in").Select(ParseWire).ToList();
             intersections = wires[0].Keys.Intersect(wires[1].Keys);
         }
 
-        public override void Part1()
+        public override string Part1()
         {
-            Console.WriteLine(intersections.Min(x => Math.Abs(x.Item1) + Math.Abs(x.Item2)));
+            return $"{intersections.Min(x => Math.Abs(x.Item1) + Math.Abs(x.Item2))}";
         }
 
-        public override void Part2()
+        public override string Part2()
         {
             // add 2 to count (0, 0) on both lines
-            Console.WriteLine(intersections.Min(x => wires[0][x] + wires[1][x]) + 2);
+            return $"{intersections.Min(x => wires[0][x] + wires[1][x]) + 2}";
         }
 
         private static Dictionary<(int, int), int> ParseWire(string line)
diff --git a/Day4.cs b/Day4.cs
index 695ccac..7394f3d 100644
--- a/Day4.cs
+++ b/Day4.cs
@@ -1,21 +1,19 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
+using System.IO;
 using System.Linq;
 
 namespace aoc2019
 {
     internal class Day4 : Day
     {
-        int start, end;
+        public override int DayNumber => 4;
+
+        private readonly int start;
+        private readonly int end;
 
         public Day4()
         {
             var range = File.ReadLines("input/day4.in")
-                .First()
-                .Split('-')
-                .Select(i => int.Parse(i))
-                .ToList();
+                .First().Split('-').Select(int.Parse).ToList();
 
             start = range[0]; end = range[1];
         }
@@ -34,20 +32,20 @@ namespace aoc2019
             return i >= start && i <= end && hasDup;
         }
 
-        public override void Part1()
+        public override string Part1()
         {
-            Console.WriteLine(Enumerable.Range(start, end).Count(i => IsValid(i)));
+            return $"{Enumerable.Range(start, end).Count(IsValid)}";
         }
 
         private bool HasOnePair(int i)
         {
             var s = i.ToString();
-            return s.Select(c => s.Count(j => j == c)).Any(c => c == 2);
+            return IsValid(i) && s.Select(c => s.Count(j => j == c)).Any(c => c == 2);
         }
 
-        public override void Part2()
+        public override string Part2()
         {
-            Console.WriteLine(Enumerable.Range(start,end).Count(i => IsValid(i) && HasOnePair(i)));
+            return $"{Enumerable.Range(start,end).Count(HasOnePair)}";
         }
     }
 }
diff --git a/DayFactory.cs b/DayFactory.cs
deleted file mode 100644
index 0a05ecb..0000000
--- a/DayFactory.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using System;
-
-namespace aoc2019
-{
-    internal class DayFactory
-    {
-        internal static Day GetDay(int daynum)
-        {
-            switch (daynum)
-            {
-                case 1: return new Day1();
-                case 2: return new Day2();
-                case 3: return new Day3();
-                case 4: return new Day4();
-                default: return null;
-            }
-        }
-    }
-}
diff --git a/Program.cs b/Program.cs
index 146196e..2b98b6d 100644
--- a/Program.cs
+++ b/Program.cs
@@ -1,4 +1,7 @@
 using System;

+using System.Collections.Generic;

+using System.Linq;

+using System.Reflection;

 

 namespace aoc2019

 {

@@ -6,29 +9,28 @@ namespace aoc2019
     {

         static void Main(string[] args)

         {

+            var days = GetDays();

+

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

             {

-                if (daynum >= 0 && daynum <= 25)

-                {

-                    Day day = DayFactory.GetDay(daynum);

-                    day.AllParts();

-                }

+                var d = days.Where(d => d.DayNumber == daynum);

+                if (d.Any())

+                    d.First().AllParts();

                 else

-                {

-                    Console.WriteLine($"{daynum} is an invalid day");

-                    return;

-                }

+                    Console.WriteLine($"{daynum} invalid or not yet implemented");

             }

             else

             {

-                for (var i = 1; i <= 25; ++i)

+                foreach (var d in days)

                 {

-                    var day = DayFactory.GetDay(i);

-                    if (day == null) continue;

-                    Console.WriteLine($"Day {i}:");

-                    day.AllParts();

+                    d.AllParts();

                 }

             }

         }

+

+        private static IEnumerable<Day> GetDays() =>

+            Assembly.GetExecutingAssembly().GetTypes()

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

+                .Select(t => (Day)Activator.CreateInstance(t));

     }

 }