示例#1
0
        private static Day16Input ConvertInput(string input)
        {
            var result = new Day16Input();
            var groups = input.SplitOnBlankLines();

            groups.Should().HaveCount(3);

            result.Classes.AddRange(groups[0]
                                    .SplitIntoLines()
                                    .Select(line => RegexUtils.Deserialize <Day16Class>(line,
                                                                                        @"(?<Name>[^:]+): (?<Range1Min>\d+)-(?<Range1Max>\d+) or (?<Range2Min>\d+)-(?<Range2Max>\d+)")));

            result.MyTicket =
                groups[1]
                .SplitIntoLines()
                .Skip(1)
                .Select(it => it.Split(",").Select(item => Convert.ToInt32(item)).ToList())
                .Single();

            result.Tickets.AddRange(groups[2]
                                    .SplitIntoLines()
                                    .Skip(1)
                                    .Select(it => it.Split(",").Select(item => Convert.ToInt32(item)).ToList()));

            return(result);
        }
示例#2
0
        private static long Part2(Day16Input input)
        {
            var positionToClass = GetPositions(input).ToList();

            long sum = 1;

            foreach (var rule in input.Classes.Where(it => it.Name.StartsWith("departure")))
            {
                var positionIndex = positionToClass.Select((it, index) => (it, index)).Single(it => it.it == rule).index;
                sum *= input.MyTicket[positionIndex];
            }

            return(sum);
        }
示例#3
0
        private static IEnumerable <Day16Class> GetPositions(Day16Input input)
        {
            var tickets = input.Tickets
                          .Where(ticket => ticket.All(value => input.Classes.Any(klass => klass.Validate(value))))
                          .ToList();

            var rotated = tickets
                          .SelectMany(ticket => ticket.Select((it, index) => (it, index)))
                          .GroupBy(it => it.index)
                          .Select(it => it.Select(z => z.it));

            var positionToClass = rotated
                                  .Select(values => input.Classes.Where(klass => values.All(value => klass.Validate(value))).ToHashSet())
                                  .ToArray();

            var(resolved, _) = Produce.Forever((
                                                   resolved: new Day16Class[input.Tickets[0].Count],
                                                   unresolved: positionToClass.Select((it, index) => (it, index))),
                                               state =>
            {
                var groups = state.unresolved
                             .GroupBy(ptc => ptc.it.Count == 1).ToDictionary(g => g.Key, g => g.ToList());
                var unresolved = groups.TryGetValue(false, out var value)
                        ? value
                        : new List <(HashSet <Day16Class> it, int index)>();
                foreach (var ruleset in groups[true])
                {
                    var rule = ruleset.it.First();
                    state.resolved[ruleset.index] = rule;
                    foreach (var otherruleset in unresolved)
                    {
                        otherruleset.it.Remove(rule);
                    }
                }

                return(state.resolved, unresolved);
            })
                               .First(state => !state.unresolved.Any());

            resolved.Should().NotContainNulls();

            return(resolved);
        }
示例#4
0
 public void SetUp()
 {
     _solver = new Day16Solver();
     _input  = new Day16Input();
 }
示例#5
0
 private static long Part1(Day16Input input)
 {
     return(input.Tickets
            .SelectMany(ticket => ticket.Where(value => input.Classes.All(klass => !klass.Validate(value))))
            .Sum());
 }