Example #1
0
        private static void SolvePart2(Dictionary <int, Rule> rules, string[] messages)
        {
            // 0: 8 11
            // 8: 42 | 42 8
            // 11: 42 31 | 42 11 31
            Rule rule42 = rules[42];
            Rule rule31 = rules[31];

            HashSet <string> rule42Map = rule42.Permutations;
            HashSet <string> rule31Map = rule31.Permutations;

            int matches = 0;

            Console.WriteLine($"messages = {messages.Length}, <=24 {messages.Count(x => x.Length <= 24)}, >24 {messages.Count(x => x.Length > 24)}");

            foreach (string message in messages)
            {
                // if we start at the end and go down until we don't match 31
                if (!rule42Map.Contains(message.Substring(0, 8)) ||
                    !rule42Map.Contains(message.Substring(8, 8)))
                {
                    continue;
                }
                if (!rule31Map.Contains(message.Substring(message.Length - 8, 8)))
                {
                    continue;
                }
                int minRequired42 = 0;
                int currentIndex  = message.Length - 8;

                while (currentIndex > (16 + minRequired42 * 8))
                {
                    if (!rule31Map.Contains(message.Substring(currentIndex - 8, 8)))
                    {
                        break;
                    }

                    minRequired42++;
                    currentIndex -= 8;
                }

                bool match = true;
                while (currentIndex > 16)
                {
                    if (!rule42Map.Contains(message.Substring(currentIndex - 8, 8)))
                    {
                        match = false;
                        break;
                    }

                    currentIndex -= 8;
                }
                if (!match || minRequired42 > 0)
                {
                    continue;
                }

                matches++;
            }

            Console.WriteLine("Part 2 ------");
            Console.WriteLine("After updating rules 8 and 11, how many messages completely match rule 0?");
            Console.WriteLine(matches);
        }