//###################################################################### // Part 1 + 2 Solutions //###################################################################### public static int Part1() { const string path = Helpers.inputPath + @"\day16\input.txt"; string input = ProcessInputFile(path); IList <TicketValidator.Rule> rules = ParseRules(input); TicketValidator validator = new TicketValidator(); validator.AddRules(rules); IList <IList <int> > tickets = ParseNearbyTickets(input); int errorRate = 0; foreach (var ticket in tickets) { foreach (int val in ticket) { if (!validator.ValidateValue(val)) { errorRate += val; } } } return(errorRate); }
public static long Part2() { const string path = Helpers.inputPath + @"\day16\input.txt"; string input = ProcessInputFile(path); IList <TicketValidator.Rule> rules = ParseRules(input); TicketValidator validator = new TicketValidator(); validator.AddRules(rules); IList <int> myTicket = ParseYourTicket(input); IList <IList <int> > nearbyTickets = ParseNearbyTickets(input); IList <string> fieldOrder = FindFieldOrder(validator, nearbyTickets); long result = 1; for (int i = 0; i < myTicket.Count; i++) { if (fieldOrder[i].StartsWith("departure")) { result *= (long)myTicket[i]; } } return(result); }
public static IList <string> FindFieldOrder(TicketValidator validator, IList <IList <int> > tickets) { IList <IList <int> > validTickets = tickets.Where(t => validator.ValidateValues(t)).ToList(); int fieldCount = tickets[0].Count; var fieldIndices = new Dictionary <string, ISet <int> >(); foreach (string field in validator.Rules) { var indices = new HashSet <int>(Enumerable.Range(0, fieldCount)); fieldIndices.Add(field, indices); } IList <string> result = new List <string>(); foreach (int i in Enumerable.Range(0, fieldCount)) { result.Add("NONE"); } // find which indices the field cannot be due to values breaking rules foreach (var ticket in validTickets) { for (int i = 0; i < fieldCount; i++) { int val = ticket[i]; IList <string> invalidFields = validator.RulesBroken(val); foreach (string field in invalidFields) { fieldIndices[field].Remove(i); } } } // deduce index assignments from remaining possible values var assignedIndices = new HashSet <int>(); bool unassignedExists = false; do { unassignedExists = false; foreach (var field in fieldIndices) { // unassigned; ExceptWith removes any indices already assigned if (field.Value.Count > 1) { unassignedExists = true; field.Value.ExceptWith(assignedIndices); } // otherwise assign index else { assignedIndices.Add(field.Value.First()); result[field.Value.First()] = field.Key; } } } while (unassignedExists); return(result); }