tidy up, refactor program.cs by day

This commit is contained in:
Ben Harris 2019-12-05 01:19:39 -05:00
parent b0c565618b
commit 5b4353d91f
7 changed files with 64 additions and 102 deletions

14
Day.cs
View File

@ -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();
}
}

21
Day1.cs
View File

@ -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 readonly IEnumerable<int> 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()}";
}
}

46
Day2.cs
View File

@ -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<int> input =
File.ReadLines("input/day2.in")
.First()
.Split(',')
.Select(num => int.Parse(num));
public override int DayNumber => 2;
public static void RunIntCode(ref List<int> v)
private static readonly IEnumerable<int> input =
File.ReadLines("input/day2.in").First().Split(',').Select(int.Parse);
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;
}
}
}

12
Day3.cs
View File

@ -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)

24
Day4.cs
View File

@ -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)}";
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -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));
}
}