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); }