public int GetErrorRate() { var retVal = 0; foreach (var ticket in NearbyTickets) { var isValid = true; foreach (var t in ticket) { if (AcceptableRanges.Any(i => Enumerable.Range(i.Min1, i.Max1 - i.Min1 + 1).Contains(t) || Enumerable.Range(i.Min2, i.Max2 - i.Min2 + 1).Contains(t))) { continue; } retVal += t; isValid = false; } if (isValid) { ValidNearbyTickets.Add(ticket); } } return(retVal); }
public long GetDepartureAnswer() { ValidNearbyTickets.Add(MyTicket); for (var ii = 0; ii < MyTicket.Count(); ii++) { var ticketVals = ValidNearbyTickets.Select(tVal => tVal[ii]).ToList(); foreach (var range in AcceptableRanges.Where(range => ticketVals.All(j => Enumerable.Range(range.Min1, range.Max1 - range.Min1 + 1).Contains(j) || Enumerable.Range(range.Min2, range.Max2 - range.Min2 + 1).Contains(j)))) { range.TicketPositions.Add(ii); } } // Figure out which ranges belong to which positions while (AcceptableRanges.Any(i => i.TicketPositions.Count <int>() != 1)) { var rangesWithSinglePosition = AcceptableRanges.Where(i => i.TicketPositions.Count() == 1).ToList(); var filledPositions = rangesWithSinglePosition.Select(i => i.TicketPositions.First()).ToList(); foreach (var val in filledPositions) { foreach (var range in AcceptableRanges.Where(i => i.TicketPositions.Count() > 1 && i.TicketPositions.Contains(val))) { range.TicketPositions.Remove(val); } } } //foreach (var range in AcceptableRanges.Where(i => i.Label.Contains("departure"))) //{ // retVal *= MyTicket[range.TicketPositions.First()]; //} //return retVal; return(AcceptableRanges.Where(i => i.Label.Contains("departure")).Aggregate <Range, long>(1, (current, range) => current * MyTicket[range.TicketPositions.First()])); }