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); }
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); }
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); }
public void SetUp() { _solver = new Day16Solver(); _input = new Day16Input(); }
private static long Part1(Day16Input input) { return(input.Tickets .SelectMany(ticket => ticket.Where(value => input.Classes.All(klass => !klass.Validate(value)))) .Sum()); }