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 lines = - File.ReadLines("input/day1.in").Select(line => int.Parse(line)); + public override int DayNumber => 1; + + private static readonly IEnumerable masses = + File.ReadLines("input/day1.in").Select(int.Parse); private static int FuelCost(int weight) => weight / 3 - 2; - - public override void Part1() - { - Console.WriteLine(lines.Select(num => FuelCost(num)).Sum()); - } - 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 { - private static readonly IEnumerable input = - File.ReadLines("input/day2.in") - .First() - .Split(',') - .Select(num => int.Parse(num)); + public override int DayNumber => 2; - public static void RunIntCode(ref List v) + private static readonly IEnumerable input = + File.ReadLines("input/day2.in").First().Split(',').Select(int.Parse); + + public static List RunIntCode(int noun, int verb, List 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 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> 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 GetDays() => + Assembly.GetExecutingAssembly().GetTypes() + .Where(t => t.BaseType == typeof(Day)) + .Select(t => (Day)Activator.CreateInstance(t)); } }