-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathProgram.cs
105 lines (89 loc) · 2.66 KB
/
Program.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using AdventOfCode.Year2023;
using System.Diagnostics;
using System.Reflection;
namespace AdventOfCode;
internal class Program
{
static void Main(string[] args)
{
Run(21);
}
static void Run(int num)
{
var days = GetOrderedDescendingDays();
var concreteDay = days.Where(f => f.attr.DayNumber == num);
if (!concreteDay.Any())
Console.WriteLine("No suitable days found");
else
ExecuteDay(concreteDay.First());
}
static void ExecuteDay((Day day, AocDayAttribute attr) pair)
{
var (day, attr) = (pair.day, pair.attr);
var dayNumber = attr.DayNumber;
var path = @$".\Year2023\Input\Day{dayNumber}.txt";
var input = File.ReadAllText(path);
day.Input = input;
day.InputLines = Utils.Lines(input);
var watch = new Stopwatch();
Console.WriteLine("Part one:");
watch.Start();
try
{
day.PartOne();
}
catch (Exception exc)
{
Console.WriteLine("Catched an exception");
Console.WriteLine(exc);
}
watch.Stop();
Console.WriteLine($"Part one taken: {watch.ElapsedMilliseconds} ms");
Console.WriteLine();
Console.WriteLine("Part two:");
watch.Restart();
try
{
day.PartTwo();
}
catch (Exception exc)
{
Console.WriteLine("Catched an exception");
Console.WriteLine(exc);
}
watch.Stop();
Console.WriteLine($"Part two taken: {watch.ElapsedMilliseconds} ms");
}
static IEnumerable<(Day day, AocDayAttribute attr)> GetOrderedDescendingDays()
{
var dayInherits = Assembly
.GetExecutingAssembly()
.GetTypes()
.Where(f => f.IsSubclassOf(typeof(Day)));
var results = new List<(Day day, AocDayAttribute attr)>();
foreach (var v in dayInherits)
{
var obj = Activator.CreateInstance(v);
var attr = v.GetCustomAttribute<AocDayAttribute>();
if (attr is not null && obj is not null)
results.Add(((Day)obj, attr));
}
return results.OrderByDescending(f => f.attr.DayNumber);
}
}
public abstract class Day
{
public string Input { get; set; } = default!;
public string[] InputLines { get; set; } = default!;
public virtual void PartOne() { }
public virtual void PartTwo() { }
}
[AttributeUsage(AttributeTargets.Class)]
public class AocDayAttribute : Attribute
{
public int DayNumber { get; set; }
public AocDayAttribute(int dayNumber)
{
DayNumber = dayNumber;
}
}