Ejemplo n.º 1
0
        public void SolvePart2()
        {
            long solution = 1;
            Dictionary <string, List <int> > remainder = new Dictionary <string, List <int> >();
            Dictionary <string, int>         fieldMap  = new Dictionary <string, int>();
            HashSet <int> masterSet = new HashSet <int>();

            Tuple <string, HashSet <int> >[] rules = InputUtil.Rules();
            int[]   myTicket      = InputUtil.MyTicket();
            int[][] nearbyTickets = InputUtil.NearbyTickets();
            foreach (var x in rules)
            {
                masterSet.UnionWith(x.Item2);
            }

            List <int[]> validTickets = TickProc.ValidateTickets(nearbyTickets, masterSet);

            Dictionary <string, List <int> > possMap = TickProc.GetPossibleFieldMappings(validTickets, rules);

            do
            {
                remainder = TickProc.AssignPerfectFits(possMap, ref fieldMap);
                remainder = TickProc.AssignUniqueFits(remainder, ref fieldMap);
                possMap   = remainder;
            }while (remainder.Count > 0);

            foreach (var item in fieldMap)
            {
                if (item.Key.StartsWith("departure"))
                {
                    solution *= (long)myTicket[item.Value];
                }
            }
            Console.WriteLine($"solution: {solution}");
        }
Ejemplo n.º 2
0
        public void SolveTest()
        {
            long solution = 1;
            Dictionary <string, List <int> > remainder = new Dictionary <string, List <int> >();
            Dictionary <string, int>         fieldMap  = new Dictionary <string, int>();
            HashSet <int> masterSet = new HashSet <int>();

            Tuple <string, HashSet <int> >[] rules = InputUtil.Rules();
            int[]   myTicket      = InputUtil.MyTicket();
            int[][] nearbyTickets = InputUtil.NearbyTickets();
            foreach (var x in rules)
            {
                masterSet.UnionWith(x.Item2);
            }

            List <int[]> validTickets = TickProc.ValidateTickets(nearbyTickets, masterSet);

            Dictionary <string, List <int> > possMap = TickProc.GetPossibleFieldMappings(validTickets, rules);

            int ITERATE_OUT = 10000;
            int i           = 0;

            do
            {
                remainder = TickProc.AssignPerfectFits(possMap, ref fieldMap);
                remainder = TickProc.AssignUniqueFits(remainder, ref fieldMap);
                if (i > ITERATE_OUT)
                {
                    Console.WriteLine($"Max iterations reached. Remainder still contains {remainder.Count} item(s).");
                    break;
                }
                possMap = remainder;
            }while (remainder.Count > 0);


            Console.WriteLine($"field map count: {fieldMap.Count}");

            foreach (var item in fieldMap)
            {
                Console.WriteLine($"field: {item.Key}, idx: {item.Value}");

                if (item.Key.StartsWith("departure"))
                {
                    solution *= (long)myTicket[item.Value];
                }
            }
            Console.WriteLine($"solution: {solution}");
        }