Example #1
0
    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);
    }
Example #2
0
    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);
    }
Example #3
0
    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);
    }
Example #4
0
    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)))
Example #5
0
 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;
 }
Example #6
0
    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));
            }
        }
    }
Example #7
0
 public void None_before_2015_december_1()
 => AdventDate.AllAvailable(new Date(2015, 11, 30)).Should().BeEmpty();
Example #8
0
 public void _50_per_year()
 => AdventDate.AllAvailable(new Date(2015, 12, 26)).Should().HaveCount(50);
Example #9
0
 public void Two_at_2015_december_1_after_5AM()
 => AdventDate.AllAvailable(new DateTime(2015, 12, 01, 05, 00, 00, DateTimeKind.Utc)).Should().HaveCount(2);
Example #10
0
 public bool Matches(AdventDate date) => Date.Matches(date);