public void Part2() { TicketData ticketData = TicketDataParser.Parse(StringListRetriever.Retreive("InputList15.txt").ToList()); TicketValidationResult ticketValidationResult = TicketValidator.ValidateNearby(ticketData); FieldOrderResult fieldOrderResult = FieldOrderFinder.FindFieldOrderFor(ticketValidationResult.Tickets, ticketData.ValidationRules); Assert.Equal(1307550234719, fieldOrderResult.FieldOrder.Keys.Where(x => x.StartsWith("departure")) .Select(x => System.Convert.ToInt64(ticketData.Tickets[0].DataItems[fieldOrderResult.FieldOrder[x]])) .Aggregate <long, long>(1, (x, y) => x * y)); }
public void Part2Sample() { TicketData ticketData = TicketDataParser.Parse(GetPart2SampleData()); Assert.Equal(3, ticketData.ValidationRules.Count); Assert.Equal(4, ticketData.Tickets.Count); TicketValidationResult ticketValidationResult = TicketValidator.ValidateNearby(ticketData); Assert.Equal(3, ticketValidationResult.Tickets.Count); FieldOrderResult fieldOrderResult = FieldOrderFinder.FindFieldOrderFor(ticketValidationResult.Tickets, ticketData.ValidationRules); }
internal static FieldOrderResult FindFieldOrderFor(List <Ticket> tickets, List <TicketValidationRule> validationRules) { FieldOrderResult result = new FieldOrderResult(); Dictionary <string, List <int> > ruleOrderMatrix = ComputeRuleOrderMatrixFor(tickets, validationRules); while (ruleOrderMatrix.Any(x => x.Value.Count > 0)) { foreach (string key in ruleOrderMatrix.Keys.Where(x => ruleOrderMatrix[x].Count == 1).ToList()) { int dataItemIndex = ruleOrderMatrix[key][0]; result.FieldOrder.Add(key, dataItemIndex); ruleOrderMatrix.Remove(key); foreach (string otherKey in ruleOrderMatrix.Keys.Where(x => ruleOrderMatrix[x].Contains(dataItemIndex)).ToList()) { ruleOrderMatrix[otherKey].Remove(dataItemIndex); } } } return(result); }