public static List <TimeRanking> Time(Participants participants, int year) { var list = new List <TimeRanking>(participants .Where(p => p.Value.Solutions.Any(s => s.Key.Year == year)) .Select(p => new TimeRanking(p.Value, year))); for (var day = 1; day <= 25; day++) { var one = new AdventDate(year, day, 1); var two = new AdventDate(year, day, 2); var score = list.Count; foreach (var participant in list .Where(p => p.Solutions.ContainsKey(one) && p.Solutions.ContainsKey(two)) .OrderBy(p => p.Solutions[two] - p.Solutions[one])) { participant.Score += score--; } } list.Sort(); var pos = 1; foreach (var participant in list) { participant.Position = pos++; } return(list); }
public static List <DefaultRanking> Default(Participants participants, int year) { var list = new List <DefaultRanking>(participants .Where(p => p.Value.Solutions.Any(s => s.Key.Year == year)) .Select(p => new DefaultRanking(p.Value, year))); for (var day = 1; day <= 25; day++) { foreach (var part in new[] { 1, 2 }) { var date = new AdventDate(year, day, part); var score = list.Count; foreach (var participant in list .Where(p => p.Solutions.ContainsKey(date)) .OrderBy(p => p.Solutions[date])) { participant.Score += score--; } } } list.Sort(); var pos = 1; foreach (var participant in list) { participant.Position = pos++; } return(list); }
public static List <OverallRanking> Overall(Participants participants) { var list = new List <OverallRanking>(participants .Where(p => p.Value.Solutions.Any()) .Select(p => new OverallRanking(p.Value))); foreach (var date in AdventDate.AllAvailable()) { var score = list.Count(p => p.Solutions.Keys.Any(d => d.Year == date.Year)); foreach (var participant in list .Where(p => p.Solutions.ContainsKey(date)) .OrderBy(p => p.Solutions[date])) { participant.Score += score--; } } list.Sort(); var pos = 1; foreach (var participant in list) { participant.Position = pos++; } return(list); }
private static int Rank(AdventPuzzles puzzles, AdventDate date) { var sw = Stopwatch.StartNew(); var total = 0; var durations = puzzles.Matching(date) .Where(puzzle => !puzzle.Date.Matches(new AdventDate(default, 25, 2)))
public AdventPuzzle(AdventDate date, MethodInfo method) { Date = date; Method = method; Input = Method.GetCustomAttributes <PuzzleAttribute>() .FirstOrDefault(a => a.GetType() == typeof(PuzzleAttribute) || a.GetType() == typeof(Now.PuzzleAttribute)).Input; }
public static int Main(string[] args) { if (args?.Length < 1) { return(Usage()); } var puzzles = AdventPuzzles.Load(); if (!AdventDate.TryParse(args[0], out var date)) { return(InvalidDay(args[0])); } if (date.SpecifiesYearDay() && !puzzles.Contains(date)) { return(Generate(date)); } else if (args.Length == 2 && args[1] == "-rank") { return(Rank(puzzles, date)); } else { var matching = puzzles.Matching(date); if (matching.Any()) { foreach (var puzzle in matching) { puzzle.Run(); } return(Success); } else { return(NoMethod(date)); } } }
public void None_before_2015_december_1() => AdventDate.AllAvailable(new Date(2015, 11, 30)).Should().BeEmpty();
public void _50_per_year() => AdventDate.AllAvailable(new Date(2015, 12, 26)).Should().HaveCount(50);
public void Two_at_2015_december_1_after_5AM() => AdventDate.AllAvailable(new DateTime(2015, 12, 01, 05, 00, 00, DateTimeKind.Utc)).Should().HaveCount(2);
public bool Matches(AdventDate date) => Date.Matches(date);