using AdventOfCode.Contracts; using Mono.Options; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace AdventOfCode { class Program { private static bool Help { get; set; } private static bool BigBoi { get; set; } private static List Year { get; set; } = new List(); private static List Day { get; set; } = new List(); private static void Main(string[] args) { OptionSet options = new OptionSet() { { "h|?|help", "Prints this help message and exits", s => Help = s != null }, { "y|year=", "The year of the challenge", (int s) => Year.Add(s) }, { "d|day=", "The day(s) of the challenge. Accepts multiple (-d 1, -day=2)", (int s) => Day.Add(s) }, { "b|BigBoi", "Tells the program if it should run the BigBoi input", s => BigBoi = s != null} }; try { options.Parse(args); } catch (OptionException e) { Error(e.Message); Exit(); return; } if (Help) { Console.WriteLine("Usage: dotnet ./AoC.dll [OPTIONS]"); Console.WriteLine("If no options are provided, all years and days will be run."); Console.WriteLine("If only a year is provided, all days from that year will be run."); Console.WriteLine("If only a day is provided, the provided day from all years will be run."); options.WriteOptionDescriptions(Console.Out); return; } if (!Day.Any() && (Day.Min() < 0 || Day.Max() > 25)) { Error("Days must be between 1 and 25."); return; } var days = GetDays(); if (Day.Any()) { days = days.Where(d => Day.Contains(d.DayNumber)); } if (Year.Any()) { days = days.Where(d => Year.Contains(d.Year)); } foreach (Day d in days) { d.Execute(BigBoi); d.Write(); } Exit(); } private static void Error(string e) { Console.Write("Advent of Code:"); Console.WriteLine(e); Console.WriteLine("Try AdventOfCode --help for more information"); } private static void Exit() { Console.WriteLine("Press any key to exit."); Console.ReadKey(); } private static IEnumerable GetDays() => Assembly.GetExecutingAssembly() .GetTypes() .Where(t => t.BaseType == typeof(Day)) .Select(t => (Day)Activator.CreateInstance(t)) .OrderBy(t => t.Year) .ThenBy(t => t.DayNumber); } }