コード例 #1
0
        //######################################################################
        // 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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }