diff --git a/inputs/day19.txt b/inputs/day19.txt new file mode 100644 index 0000000..3f03965 --- /dev/null +++ b/inputs/day19.txt @@ -0,0 +1,530 @@ +3: 97 29 | 2 104 +45: 97 10 | 2 73 +114: 44 97 | 90 2 +78: 2 95 | 97 32 +7: 97 64 | 2 119 +118: 97 81 | 2 58 +64: 97 29 | 2 14 +106: 53 121 +4: 2 103 | 97 55 +54: 2 53 | 97 44 +58: 33 97 | 130 2 +91: 104 97 +102: 104 97 | 83 2 +128: 2 59 | 97 3 +79: 98 2 | 124 97 +117: 2 65 | 97 92 +1: 75 2 | 115 97 +40: 2 96 | 97 119 +8: 42 +92: 102 97 | 57 2 +97: "a" +93: 2 66 | 97 103 +36: 2 104 | 97 32 +2: "b" +108: 43 2 | 68 97 +46: 44 2 | 90 97 +31: 97 5 | 2 132 +110: 14 2 | 90 97 +61: 38 2 | 9 97 +10: 63 2 | 34 97 +32: 2 2 | 97 121 +11: 42 31 +103: 121 121 +131: 75 97 | 60 2 +74: 2 112 | 97 47 +20: 93 2 | 69 97 +53: 97 2 | 97 97 +23: 125 121 +9: 97 66 | 2 25 +101: 83 97 | 95 2 +35: 25 2 | 104 97 +76: 97 55 | 2 104 +125: 83 2 | 32 97 +22: 59 97 | 76 2 +127: 6 97 | 55 2 +126: 97 119 | 2 17 +113: 59 97 | 35 2 +81: 46 2 | 72 97 +104: 2 2 | 97 2 +100: 25 2 | 95 97 +95: 97 2 +132: 97 27 | 2 45 +107: 97 90 | 2 32 +34: 98 97 | 50 2 +33: 2 95 | 97 83 +119: 32 97 | 66 2 +90: 2 2 | 97 97 +77: 126 2 | 22 97 +6: 2 97 +14: 97 2 | 2 121 +94: 2 110 | 97 129 +21: 56 97 | 105 2 +65: 2 96 | 97 98 +122: 2 71 | 97 86 +87: 101 97 | 91 2 +15: 107 97 | 120 2 +120: 103 2 | 66 97 +56: 128 2 | 20 97 +129: 2 66 | 97 83 +41: 97 48 | 2 122 +13: 39 97 | 26 2 +30: 97 88 | 2 54 +84: 55 97 | 53 2 +86: 84 2 | 59 97 +96: 55 2 | 104 97 +83: 97 121 | 2 97 +50: 53 97 | 95 2 +19: 2 70 | 97 78 +121: 2 | 97 +57: 53 2 | 83 97 +37: 6 97 | 6 2 +68: 97 53 | 2 83 +112: 97 23 | 2 19 +66: 2 97 | 2 2 +49: 97 90 | 2 103 +80: 2 97 | 97 97 +85: 83 97 | 55 2 +12: 2 35 | 97 51 +116: 97 67 | 2 77 +123: 4 2 | 85 97 +82: 21 2 | 111 97 +105: 30 97 | 87 2 +72: 25 97 | 95 2 +115: 104 2 | 29 97 +63: 97 37 | 2 36 +42: 24 2 | 82 97 +0: 8 11 +70: 2 80 | 97 25 +5: 2 74 | 97 116 +52: 16 97 | 94 2 +62: 35 97 | 114 2 +18: 123 2 | 61 97 +25: 97 97 +88: 83 97 | 66 2 +124: 2 6 | 97 80 +89: 114 97 | 100 2 +44: 97 2 | 2 97 +71: 49 97 | 106 2 +38: 2 104 | 97 90 +75: 53 2 | 104 97 +98: 53 2 | 25 97 +69: 97 95 | 2 95 +73: 2 1 | 97 7 +24: 41 97 | 109 2 +48: 2 40 | 97 113 +39: 103 2 | 104 97 +67: 2 15 | 97 62 +55: 2 2 +47: 2 79 | 97 108 +51: 6 2 | 95 97 +17: 95 2 | 90 97 +59: 53 97 | 66 2 +28: 2 12 | 97 131 +27: 2 52 | 97 28 +29: 97 97 | 2 121 +16: 4 2 | 127 97 +109: 2 117 | 97 18 +43: 104 97 | 6 2 +99: 97 89 | 2 13 +130: 83 121 +111: 99 2 | 118 97 +60: 97 44 | 2 25 +26: 121 44 + +abbbbababababbaabbbbbbab +bababababaabbbaaaabaabaaaaabaabaaabbbbab +baaaabbbabbbbababbbbaabababaaababbaaaabbbbabbbbb +abbababaaabbabbaabaaaaaaaaaabaabaaabaabb +aabbaababaabbabbaaabaababaaaabab +baabaaaaabbabaabaaabaaabbaaabbabbaaabbbbbabbbaba +babaabaaabaabaababaabbab +bbbbbababbbaaaababaaaaabbaabaaba +bbaabaaaaaaabbabbababaabbabbaaaa +aabbababaaaabababbbbaabbaaabbaba +bbaaababbbbaababbbbabababbaaabaaaaababba +bbbbababaabbbabaabbaabbaaaaabbbabbbbbbbbbaaaabaabbbaaababbaaaaababbbabbabbabaaab +bbbabbbabbaaabaaabaababbbaabaabaaabbbbba +abbbbbabbaabbbbbbaaaabbbbaaaaabb +aabbababbabbababbbbbaaabaababbaabbaabbaa +bbbbbabaaabbaaaaabaaabbbabbaaaba +baaabbbbbaabbaaabbbaabaaaaaabbbbaabaaaab +bbabbbaaaabaabbaabbbabab +bbbbbabbbabbbababbabaabaabbbbaab +aaaabbabbbababbabbaabaaaaabbbaaaabbabbababbbaabbbbbbaaaa +bbaabbabbaaabbabababbbbbbbbbabbbaabaaaaaabbababbbbbaaaba +bbbaabbbaaabbaabbbbbbaaa +bbabbabbbababbbbababbbaa +baabbbabaabaaabaabbbbbbbaaabbaaaabbababa +aabbaabaabaabbbabbbbabaaabbabbbbabbabaabbbabbbaababbbbba +aaabababbbbaaabbbaaaaaabaaaaabaabaabababbbbabaaaabaaaaabbbbbbbba +babaaabaaabbbabaabaaabbbababbabbbabbabaaaaabbaba +aabbaaaabbbbbabbbbaaabbbaabaabbbbbaaabbbabaabbbbbbbababaabbaaabbabbaaaba +aaaabababbaabaaaaaaaaaba +babbbbaababaaaabbbabbbabaaababaaabababaaaaabbaababaaaaba +abbbabaababababbabbaaaab +babaabbbbabababaabaaaabbbababababbaaaabbaabbabba +bbabbababbbababbabbaaabb +bbabababbbbababbbbbbaaaa +bbaaababaaaababbbabbbaba +aabbbabababbababbababaaaababbaabbbabbaabaabbabbbbaaaaabb +bbbbbababbaabbababaabbbbababbbaabbbabbba +abbbbaabbbaaababaaababaaababbbbbbbaaaaaabbbaababaabababb +baaaaabbbaabaaabbbbbbaaaaabbaabaaabbaaaabbbbbbbbbbaaaaabbabbbababbabbbba +abaabbbaaabaabbbbaaabbababaabbab +abbbbababbbbaaababbbbbabbababbaaababbabaabbaabbb +babbababaabbbaaabaaabbabbbbaabaabaaaabbbabaabbaaabbbbbba +babbabaabaababbabbaabbbbbaabaaabbaabaabbbbaaabbaaabababb +babaaaaababbbaaabbabbabb +baabaaabbbbababbbabababbabbabaabbbaabababbbbbbabaabaaaab +aaaaabbbaababaababbbbababbbabbaaabbbabbbabbaaabbababaabbbaaabbaaaaaabbaa +bababaaaabbbbbbbababbbababbbbbaabaabbaab +baaabbbbaaaaabbabbababaaabbabbab +aaaaabbbaabbbaaabaaaaaabbabbbbbb +aababbaabbbabbaaabbbbabbaaaabbbb +aabbababbbbbbaabbaaaaaaaabbbbaabbbabaabb +bbbbbaabbbbbabaaabbbbbaa +babababaabaaaaaabbaaabbaaaaabbbaabbbbbababaaababbbabaaabbaabbabb +bababababbaaabbbababaabb +bbabaababbaaaaabbabbbaaabbbaaaababaaaaaaaabbbbab +bbabbbabbbbbabaabbbabaaa +aaabbbaabbaaaaabbbabbabababababbabbababb +aabbaaaabaabaabbbbbbaabaaaaabaaabaabbaab +aaaabbbabbbbaaababbabbab +abbaaaaabaabbbaaaaabbbbbbbababaabbbbaabbabbbababbaaaabaa +aaaabbbababababbbaaababaabbabbbabbabbbbb +baaaaaabbaababbbabbaabaa +aaaabbbaabaaabbbbaaaabbababaaabaaaabbaaabbababaa +bbaaaaabbabbaabbbabbbaba +aaaabbbababababbababbaababaabaabaaabbaab +baaaaaababaaabbabbabbaabaaaabbbb +bbbbaaabaaabaabaaabababaabbabaabbbbaaabb +aaabbababbbbaabbbbaababbaaababba +aabaabaaaaaababbbabbaaaabaaaaabaabbabaaabbabaaabaaabbbababaaabaa +aabaaabbabbabbbaaaabbbab +bbaaaaaabaabaaaababbaaaaaabaababbbbbbabbbabbbaaabbbabbbbbabbbaab +bbbbabaabbabbaaabaaaaaaabbbaaaabaaaabbababbaabbbbbabaabaaaabbbbaaaababaa +aaababaabaababbabbaabbbbbbbabaabaaaabaaabaaabbabaaaabaab +ababababbbbbbabaababbbabbbbaaabbabbababaaaabbbba +babbbbabbaabaababbabbbaabbbaabbbbaabbaab +aabaaababbbbaaabbabaabbaababaababbbabaab +aabaaabbbbaabbbbbbbaabbababbabaabbaaabaa +abbbbbbbaabbbaabbbabbbabbababbaabbababbb +aabababababaaaaabbbababbbaabbbba +aaaababbabaaaabbaabaabbaaaabaaaa +bbbbbabbababbaaaabbbbbabbaabaababbbbbaaa +aabbaaaababbbaaaaaaabbaa +aaaaaaabaabaaabbabbaaaaa +babaaababbaaabbabaabbbbbbaaaababbbaabaab +abbabbbaaaababbbababbbabaabaababbbababab +baabbbaabbabbbabaabbbaaabbaaaabbbbaaabaaabbaabbb +babaabaaaaababababbbbabbbabaabaaaabaaabaababababbbaabbbabbaaaaaababaaaab +aabaaabbaababbaaabbbbbaa +aaababaaaaaaabbabbbbbbba +ababbbabbabaabbabbabbbbababbaabbaabababb +baabaaabbaaaaaabababbaababaaabaaabbbbbbbbaabababbbbabbba +bbababbababbababbbaabbbbbbbababbabbaaabbbbbbaabbaababbba +ababbaaaaaabbbaaababbbaa +ababbaabababbaabbaabbaba +aaaaabbabbabbbabbbaaabbbababababaaababbabababbabaaabbbabbbaaaaba +aabaabaaabbbbabbababbaababaabaaabaababab +bbabbaaaaabbbabababababbababbbaaabbbaaaababbbabbbbbbbbabaababaaa +aabaaabbbbbbababaaabaaaaaababbaaabaaabaaaabaabaabababaabbbbaaaaabbbabaaa +aaabaabaabaabbbabbbbabba +aaabbbaabaabbbabbbababbb +bbbbbaababbbbaabbbabbaabbbbaaaaa +baaaabbbbbabbbababaaaaababbbabab +bbaaaaabbaabaabbaabbaaaaabaaabaaaaababbbabaababa +babaabbaabaaabbabaababbaababaaaa +abbbaababaaabbababbbbaabaaababbbbbbbbbab +abbbbbbbbbaaabbbaabbabaa +baababbabaaababaababbabababbbbabaababbbaaaabaabbabbaaabb +bbababaabbaabbbbbabaabaababbabba +bbbaabaaababababbaabaaba +aaabaaaaaaaaabaabbabaaabbbaabbab +aaaaabbaababbabababaabaabbbaaaaa +ababbabaaaaaaaaabaabbbaaaaaaaaabaaaaaaaababbaaaa +aabaabababbaababaababbabbaabbaabbbaaaabbababbabbbaaabbba +babaaaaababbaabbbbbbabaabaaababababbbabbaabbaaab +bbabbbabbbbaaaabaaaabbaaabbaabaabaaaabaa +baababbabbabbbaabaabbaab +babaabbbabaabbbaabaaabaaabaaabab +abaababbbababbbaaaaaabbababaaabbbaaabbbb +aaaababbaabaabbabbaaaaaa +baabbbbaabababababbbbaaababbaaaabbbbaaababaabbaaaaabbbbbaabbabbbbbaaaaaa +bbbbaaabbabbbaaaaabbbbba +aaabbbaaaabababaababbaabbbbabaaa +baabbbbbbaabaabbbababbaabbbabbabaabbbbab +baaababbaabaaabbbbbaaaaaaabbabbaaaaabaab +ababbabbabbbbbbbabababbaaaabababbaaabbaa +baaabbbababaabbbbaaaaabb +bbaabbbbababaabaaaaaaaba +aabbbabbbbabbbabbbbbabba +abbabbbbaabaaabaaabaabab +aaaaaaaaaaabaababbaaaabbaabbbaabbbbabbaabbabbabbababbbaabbaababbaaaaaaba +abaabbbbaabbbabbabbbbabaabbabbab +bbaabbabbbabbbbaabbbbaabababbbbaaaaaabbabbabbbbb +bababaaabaabbbbbbbaabbbaaaabbbab +abbbabaabaabaabbbaabbababbbababababbbabb +ababaabababababaababbbabbababaabbabbbaababababbb +baabbbbbabaabbbbabbbabab +ababbabbbabababbbbabbaaaaabbabbb +baabbabbbbaabaaabbabbaabbbabaabb +babababbbabaabbaabbbbbba +abaaaaabbbababaaaabaabbbaaaabaab +baaaaaabbabbababbaababbbbaabbabbaabbbbab +abbbabaabbaaababaabbbaabaababaabbababbabaababbba +bbabababaabbbbaaaabaabaaabaababbaabaaaaababbbbabbbaaaaabbabababaaabababababbaabb +aaababaaababababbbbbbababaabbabbabbbbabababbbaba +aabaabbbaaaaaabbbbbaababbabbbbba +bbabbbabbbaaabbbabaabbbababbababbbbaaabaaaaaabaabaaabaabaabbbbaaabbbabab +bbaabbbbbbaabbbbbaaababaaababbabbaaaabba +ababbbbbabbbbaabaabaabbaabaabbab +bbabbbaaaabbbaabbbababbaaaabbbba +baabbbbbababbabababbbaababbabbbaaaaaaaba +abbabbbaaabbbaaabbabaabababbabaaabbaaaaaaaaabaabbbabbbbb +aaabaaabbaabaabbbaababaabababbbbaabaaaab +baabbbaabaabaabbaababaabbbaaabba +abaaabbbbbbbabaababaabaaababbbbaaababbaaaabbbabaabaaaabababbbbbbabbaabab +abaaaabbaaaaaaabbbbbabaaababbabbabaaabaabbaabbba +bbaabbabbbbaabaabbaabbaa +abbbbababaabbbaabbbbbabaababbbaabbbbbaaa +babaaaaabbbbbbbbbbbbbababbbaabaabaaaaaabbbabaaabaabbabaa +bbaaababbabaabbabaabbbbbbababaabaabababbbabbbbba +baaaaaababbabaabaaaababaababbaabaaaaabab +aabaaaaabababaababaaababaaaabbabaabaaabaabbababbbaaabaaabaababaa +babababbababababaaababbb +aaabaaabbbababaaaabaabbabaaabbbabaaaabab +abbabbbaaaabbbaabbaaaabbbabbbabbabaabbaa +bbbbbabbabaaabaabbababaabaabbabbbabbaabbbbbbabbbabbaaaaa +bbbbbabaaabbbabaababbbbbabaabbbbbbaaaabbbbbaabbbabaaabab +bbabababbababaabababbbbbbbbaaabbabbaabbb +aaaaaabbbbbaababbbaaabaabbbaaaaa +aaababbabbabbbaababbabbaabbabaabaaabaababbbabbabbbbbbbbbaabaaaab +abbbbbbbbaaabababaaaaaabbbabbabb +babaabaabaaabababaabbabbbabaabaabbbaabaabbabbbaabbbabaaa +bbaabbabbbabaaabaaaaaabbbbabaaab +baaababbababbaaaabbbbbba +baaababbaaaabaaaaababbaabaabbbbbabaaaaababbaabaaaabbbbaaaaabaaaa +aabaabbbbababaaababbabaabaabbaaabbaaabbbbbbbbbbbabbababb +aabbbaaababaabbabaabaaaaaabaaabbbabbaaabbababbbbabaababb +baaabbabbaaaabaaaabaaababbbbabaaaaabaaba +ababbaabbaabbbabbabbababaaaabbbbaabbabba +abaabbbbbababaaabaababab +baabaaaaabaaabbbaabbaabbaaabbbbb +bbbbbbaaaaabbaababbabbabbbbbbbaa +abaaabaabaabbbbbbabababbbabbbaaaabaabbbaabbbabbbaabaaaaa +bababbaabaaabbababaababb +bbbabaabbababbaabbbabbaababbbbbbbbbbbbab +bbbbbbbbaabaabbaaaabaaabbbaaabbbbbabbbbb +abbabbbabbbbbaabbbaaabbbbaabbbaaabaabbbbbabbabbb +baaabaaababaaaaaaabbbabbbaabbaaababbbbbbbaaaabba +abaaabbaabaabbbabbaaabbbabaaabbbaababaaa +aaaaabbbaabaabbabaabbbbbbbaabbaa +aaaabbbaabbbbabaabbabaaaaaabaabb +aaabaaabaaabaaabbaabbaaababbbbabbabaaaab +aabaaabaaabababaabaaabaaababbaaa +bbbabbaabbabaababaaabbbabbbbaabb +bbaabbbbbaaabaaaaaaaabbaaaabbbbb +abbbabbaababbbbbbbbabaaa +bbbababbababbbabaabaabba +babbbaaababaabbbbbababababbbabaaabbbbaaa +abaaaaabbaaaaaabbabbabbb +ababaababbbbbabaaababbab +abbbabbbaaaaaaababbbaaaa +babaaaaabbaaabbbabbabbbbaabbaaaaabaabbabaaabbabb +babbaabbbbbbabaaabaaabbaabaabaaabababbba +ababbbbbaaabababbbbabbaaabaaaaaa +bbaaaabbbaabbbaababbbbbb +abaabbbaabbbbbbbaaabababbbbbababaaaabbaa +abaaabaaabbabbbbbabbababbabbbaabaaaaaabaaaaaabaabaababab +abaabaabbaaabbbbbbbbbabbaaabababbbaabaaaaaaaabab +aaabbbaabaabbbbbbabaabbabbbbaabb +bababaaabaabbbaabbaaabbababbbaabbbbabaababaabbaababaaaab +aaabaabaaababababbabbbbb +bbbababbaabbbaaaaabbbaabbababbba +baabbbaaabbabbbbbbbbabaaabbbbaabbababbbb +baabaaaaaaabababaaabbbab +babababbaabbbabaabbbbaaa +babaaababbaabbbbbababaaaabbbaababbaaabaa +aabbbabbbabbababaaaabababbbaabba +aabbbaaabbabaabbbbbbabbabbbbbbaaaababaaaabbbaaabbaabbabaabbbabaaababaaaa +ababaabaaaaababbbaaaaaba +bbabbbbaababaababbabbaabbbabbaaaaaaaaaababbbbbbabbabaaababbbbaaabbabbbbb +bbaabbabbaaabaaaaaabbbaabaababbbbaababbabababbababaabaaa +bbbbbaabbababaabbbabbaabbbababaabababbab +baaabbabaababbaaaaabbbaabbbbbaabbabbbaaaabbaaaabaabbbbaa +aababababababbaaabaaaaababbabaabaaaabbbaabaaabaaabbaababbbbabbbbbbbaaaaababbbbab +aaabababaabaaabbaabaaabbaaabbabbaabbaaab +baaabaaabbbbbbbbaaaaaaba +abbbabbbbbbbaababbbabaaa +babababbbbbbbabbaabaabbababbbbba +aaaaabbaaabbbaababaaabbbaabbbbab +bbbaaaaaabbabababaabbbaaaaaabbaaaababbbaaaaabababbabaaaaaaaaababbbbbbaabbbabaaab +aabaabbabababbbaabbaabbbbbabaabbbbabaabb +aaaaaaababbbabbbbababaaababababbaabbbaaabbbabbba +babbabaababbaabbbaabaaaabbaaaaababaaabaabaabbaab +abbbbbbbabbbbabbaabbbaaaabbbbbaa +bbaaaabbbaaabbbbbbbbabbb +aaababaababaabbbababbabbabaabbbabaabbaaabbbbbaaa +bbbababbbaabbaaabbabaaaababbbaaabbabbaba +abbabbbbbbbbbaabaabbaabaababbbaa +baababbabaaaaaaaaabbbbaa +baaabbabaabbbbbbaaaabbabbbbaaabb +bababbaabaabbaaabaabbabbabababbb +bbbbbababbbabbaabaababab +aaaabbababbabbbabbbbbbbbaaabbaab +bbababbaaababbaabbbbbbbbaaaaaababaaaaaba +ababbababaabbabbaaabaaaa +bbabbbaaaaaabbabaaaaaaabbbabaababbbbbbaababbbaba +aaaaabaaababbbaabbbbabba +ababbbbaaabbbbbbbaaaabbbbbaaabbbbbbbbbaa +babbaaaaabbbabbbaabbbababaaaaabaaaabaababababbab +baabaaabbabababbbbbaabbabbbbbbabbbbbbbaa +bbabbabaaaaababbaabaabaaaabbabbabbaaaaaa +aabbbababaabbabbbabaaabaabbaaababbbbaabb +aabbbaabaabaabaaaaaababbbbbababa +abaaaaaaabababbbaaabbaabaaabaabb +abbbbabbaaaaabbbababbabbbabbbaaaabaabbbbabaabbbabbbaaaba +aabbbaaaaaabbbaaaaaaabbbbababaabbbaababaaaabbaaaababaabb +aaababaaababbaaaabbbabaaabbababb +baaabbbabaaaaaababbbabbbbbbbababbbaabaabbabbabbababbbbabbbabaaab +bbabbabaaabbababbaabbbabaabbabab +abaabbbabbbbabaabbbaabba +babaabbbababaababaabbbbbaababbba +abaabbbbabbbabaabbababbb +baaabaaaaaaabaaabbbbbaabaaaabbbb +bbaaabaaababbaabbbaaababaaaabbbbabbaaabaaaaaababbabaaaaa +babbabaaaabbababaabbbaaaabaabbbbbbbaabab +bbabaabaaababaababaababb +aabbaaaabaabbbaabaaababaabbbbbabbbabbabaaaabaabb +baabbbabbaabaabbabaabaabbaabbbbbabababaa +abaabbbaabbaabbaaaabbbbababaaabb +bbbbaaabbbbbbabaaaaabaaabbbabbab +ababbbbaabbbabaabababbbabbababbaaaabaaabaaabaaaabbaaababaaaabbaabbbbaaaa +bbaabbababababbaaabbabbb +babaaababbaaaabbaabbbbab +bbabbbaabaabbabbaabbaaaaaabbbaabaaabbbab +abaabbbbabaaaabbaabbababaaaababaabaabbbabbaababbbbbaaaba +abbbbaabbbaaababbbabbbaaaaaaabaabababaaababbaabb +aabbbabbaaabaaabaabbabba +ababbabbababbaababbbbabaabbbaaab +ababbbbaabaaaaabaabbaaab +babbbaababababbaaaabaaabbaabaaaabbaabaaabbaaabbaaabaabababbaaaba +bbbbbbbbbaabbbababbaabba +aabbababbaabaaaaababbbaa +aabbbbbbababaabaaabaaabbbbabbabaaaaaababaaabbbba +aabaabbaaabaabaabbbaabaaaaaabbbb +abaaaabbbbbbaaabaaaaabaa +baaabbbbbabbabaaababbbaa +baaababaababaaababbaaabbabaabbba +ababaababbabbbabababbababbaababb +baaaaabbbaaababbbabaaaabbabbbababaaababbaaaababbbbaaababbaabababaababaab +baabaaaabaaababbbbabbbabababbabababbabba +aabbbabbababbabbaabbaaaaaabbbbaa +aaaaaaabbbbbaaaabbbabbabbaabababbbaaaaba +aabbbbbbaaaabbbabbbabaaa +aaaabaaaabbbbbbbbbaabbaa +baaaabbbabbbbabbbbbababa +ababaabaaabbaaaaabaabaabbbbbaabb +babaabbbbabbababbbbbabaaaabbaaabbbbaababaabbaaabbbabaabb +baabbbbbbbabbbbabaabbbba +aaababaaababaababbaaababbbababbaabbbbbabbbbaabbabbbbbbab +baaababbbbaabbbbbbaabaaabbbaabbb +baabaabbaaaaabbabaaabbababbaabbb +bbabaaaabbbababbaabbbababaaabbabbbaabbabaababbabbaaaabab +baabaaaabaaabbabbabbabaabbabbbababbbbbababaabaababbbaaaababaabab +abaaabbabaaabaabbbaaaabababbbbaabaaaabba +aaaaaabaaabaaabbaaabbaaaaabbbaabaabbaaaaaaababaa +bbbbabaaaababbaabaaabbaa +ababababbaaaaaaaaaaaaabb +aabbaabaaaabbaababaaaabaabaabbabaaaaabaabbbabbba +aaaababababbababababbbaa +abaaaaaababbbaabaaababbaababbaabbabbabababbbabbabbabbaab +bbabaabaabbbabaabaaabaaababaabbbabaaaabababbaabaaabbabaa +baabaaaabababaaabbbababa +aaaababaabbabaababaaabab +baaaaaaaaabbbabababbabba +abaababbbabbbaaaaaaaabbbbaaabababaababaaabbbbabaabbbaaaaabbaaaababbaaabb +ababbabbaabaabbbababbabaaabaabab +aaaaaaabbbabaaaababaabbaabbababa +bbbabaabbbbbabaaaaaaaaabbbbaabaabbabaaabaabbaaab +ababbabbaabaaabaababababaaaabbbb +aaabaaabaabaabaaaabaaabaaabaabab +abaaabbbaabbbbbbaaaaabaa +bbababababaabbbbbbbbbbbbababaaabaaabbaba +babbabaababababbabbbbbbbbaabbabbaaabbaab +aaabbbbabbbbbbbababaababbabbaaaaaaababbb +bbaaababbbaaabbbababbabbbbbbbbbbaabbabba +babaaabaaabbbabbaaaabbabbaaabaab +babaaaaaaabaabbbabaaabab +baaabbbbababbbbbbabbbaabbabaaaab +abababbbababbaaabbaaabababababaaaabaaabb +babaabbbababaabaabaabbbb +baabbaaaaaabbbaaaabababaaabbbaabbbbaabbababbbbab +bbababaaabaaaaabbabbbaaaaaababbb +bababbaababababbbbbbaabb +babbbaaababbbaaababababababbaaabbbaabaab +aaaabbbabbaaabbbbaabbbbbbbaabaaabaaabaab +baaaabbbababbaaaaabbbabbbabbbabbbabbbbab +bbabbbabaaaaabbbbabaabbbabbabbaa +abbbbaababaababbbaaabababbbbaabababaaaaabbabbbaaaaaabbaaabbbbaab +ababbbbabbabbbaaaabbbaaababaabaabaababbaaaaabbbbaaaabbbbbabaaaab +bababababaaababaababbabbabaabbaaaaabaabb +bbaaaabbabbabbbabbaabaaaaaaaabbbaaaabbababbabbabbabbbabaabbbaaabaabaaaab +bbaaabbbbaaaabbbbabaaaaaabbbaabb +babaabbaaaabbbaaaaabaaababbbabbaabbbbbabaaabbababbaaaababbbaaaaa +ababbabbbaabbbaabaaaabaa +aabaaabaaaaaaaaabbbbbaaa +baabaaabbabaabbbababbabbbababbab +abaaabbaaaaaabbabbaababa +babbabaabaaaabbbbababbab +aaabbbaaaabbbabbababbaaababababbabbbaabbabaababb +aabaaabaaabbbabaabbaaabb +abaaaabbbaaabbbaababbbbabaababab +bbababaabbbbaaabaabbbabbabbbaababbabaaab +abababbabbabbabbaabbabaabbaabbaa +abaaabbbababbbabbbaababa +ababbbabababbabaaaaabbbaabbababa +baababbabaababaabbaaaaaa +bbbbbaabaaababababaabaaa +babbaabbaabbbaaaabbbabbaabbabaaabbabbabaaaaaaaaababbbbaaaabaabab +aabababaababaabababbbaaabbaabaaabaaaabab +bbabaabababababbbabbbaba +aaababbbaabaabaabbaaaabbbbabaaabbbaababb +baaaabbbbababaabbabababaaabbbbbbaaabaaaa +abbbbabbaabbbabbabababaa +aabbbaaabbbababbbbaaaabaabbbaabb +ababbbabaababababaaaabab +bbaaabbabbabbbaaabbbaaaa +bbaabbbbabaaabbaabababbb +abbbaababbaabaaaaabbaaaaaaaaabaa +baabbabbabaaaaabaaabaaaa +aaabababababbbbabbbbbabaabababaa +aaaaabbbaabaaabbbbbabaabaaaabbaa +aaaaabbbababbbabbababbba +ababbbabababbaabbbaaaaabbbbbbbaa +bbbaaaabaababaabbaababbaabababaa +baaaaaabbbbaaaababbabbaa +baabbabbbbababaaabbabaababbbabbaabaaaaababababbb +abaaaaabbbbaaaababbabbaa +abbabaabbaabbbaaaabbaabbaabaabaaaaababbabaabbabababaabaabbbbbbbbbaaaaabbababbbba +aaabaaabbbbabaabbaababaaabbbbbabbaaaaaaaaababaaaaaababbabaaabbaa +aaaaaaabbaabbaaababbbaababaabaaababbbbaa +bababababbbbbabbaabababbbaaabaaaaaaaaaaaaabbbaaa +babababaaaaabaaabbaaabaa +abbbbabbbababbaababbbaabbababbbb +bbabbbabaabaaabaabbabbbbabbaaaaabbbabbba +aabbaaaabaaabaaaabbbbabaaaaaaaba +baabbbbbbaaabaabababaabaababaaaaaabbaaaabbbbaabbabbabbaa +bbaaaabbbbaaabbabaaabaab +bbbbbababaabbaaabbbbbaba +bbabbababaabbabbaaaababbbbbbbabaaaaaabaa +aaabababaabaabbbabbbabbaaaababaabbbabaaabbabbbbbabaaabab +bbbabbaababbababaaaaaaba +bbbbbababbabbaabbbbaaaba +aabaabbbbbabaaaabbaaababababababbabaaaab +baaabbbabbbababbabababaa +bbaaababbabaaaaaabababbb +bbabbaababbbabbaaaababbb +bbabbbbaabababbababaaaab diff --git a/inputs/test.txt b/inputs/test.txt index eedd3d2..8c931b1 100644 --- a/inputs/test.txt +++ b/inputs/test.txt @@ -1,3 +1,47 @@ -.#. -..# -### +42: 9 14 | 10 1 +9: 14 27 | 1 26 +10: 23 14 | 28 1 +1: "a" +11: 42 31 +5: 1 14 | 15 1 +19: 14 1 | 14 14 +12: 24 14 | 19 1 +16: 15 1 | 14 14 +31: 14 17 | 1 13 +6: 14 14 | 1 14 +2: 1 24 | 14 4 +0: 8 11 +13: 14 3 | 1 12 +15: 1 | 14 +17: 14 2 | 1 7 +23: 25 1 | 22 14 +28: 16 1 +4: 1 1 +20: 14 14 | 1 15 +3: 5 14 | 16 1 +27: 1 6 | 14 18 +14: "b" +21: 14 1 | 1 14 +25: 1 1 | 1 14 +22: 14 14 +8: 42 +26: 14 22 | 1 20 +18: 15 15 +7: 14 5 | 1 21 +24: 14 1 + +abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa +bbabbbbaabaabba +babbbbaabbbbbabbbbbbaabaaabaaa +aaabbbbbbaaaabaababaabababbabaaabbababababaaa +bbbbbbbaaaabbbbaaabbabaaa +bbbababbbbaaaaaaaabbababaaababaabab +ababaaaaaabaaab +ababaaaaabbbaba +baabbaaaabbaaaababbaababb +abbbbabbbbaaaababbbbbbaaaababb +aaaaabbaabaaaaababaa +aaaabbaaaabbaaa +aaaabbaabbaaaaaaabbbabbbaaabbaabaaa +babaaabbbaaabaababbaabababaaab +aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba diff --git a/src/bin/day19.rs b/src/bin/day19.rs new file mode 100644 index 0000000..4750a67 --- /dev/null +++ b/src/bin/day19.rs @@ -0,0 +1,262 @@ +use std::collections::HashMap; +use std::error::Error; +use std::fs::File; +use std::io::{self, BufRead}; +use std::vec::Vec; + +#[derive(PartialEq, Clone, Debug)] +enum Rule { + Terminal(char), + NoneTerminal(Vec>), +} + +fn read_rule(rule: &str) -> (u32, Rule) { + let mut parts = rule.split(':'); + + let num: u32 = parts + .nth(0) + .expect("Missing rule Number") + .trim() + .parse() + .expect("Unable to parse rule numer"); + + let rest = parts.nth(0).expect("Missing actual rule").trim(); + + if rest.starts_with('"') { + ( + num, + Rule::Terminal(rest.chars().nth(1).expect("Rule char not found")), + ) + } else { + let options: Vec> = rest + .split('|') + .map(|o| { + o.trim() + .split(' ') + .map(|r| r.parse().expect("Unable to parse sub rule numer")) + .collect() + }) + .collect(); + (num, Rule::NoneTerminal(options)) + } +} + +fn match_rule<'a>(input: &'a str, rule_num: u32, rules: &HashMap) -> (bool, &'a str) { + let rule = &rules[&rule_num]; + + match rule { + Rule::Terminal(a) => { + if let Some(b) = input.chars().nth(0) { + if *a == b { + return (true, &input[1..]); + } else { + return (false, ""); + } + } else { + return (false, ""); + } + } + Rule::NoneTerminal(opts) => { + for seq in opts { + let mut rest = input; + let mut valid = true; + for r in seq { + let (ok, tail) = match_rule(rest, *r, &rules); + + if !ok { + valid = false; + break; + } + rest = tail; + + // Weird HACK + if valid && rest == "" { + if *r == 11 { + valid = true; + break; + } + } + } + + if valid { + return (true, rest); + } + } + return (false, ""); + } + }; +} + +fn main() -> Result<(), Box> { + let file = File::open("inputs/day19.txt")?; + let mut lines = io::BufReader::new(file).lines().map(|l| l.unwrap()); + + let mut rules: HashMap = HashMap::new(); + + while let Some(line) = lines.next() { + if line == "" { + break; + } + let (num, rule) = read_rule(&line); + rules.insert(num, rule); + } + + let mut input_lines: Vec = Vec::new(); + while let Some(line) = lines.next() { + if line == "" { + break; + } + input_lines.push(line); + } + + let count1 = input_lines + .iter() + .map(|l| { + if (true, "") == match_rule(l, 0, &rules) { + 1 + } else { + 0 + } + }) + .fold(0, |x, y| x + y); + + println!("Answer1: {}", count1); + + rules.insert(8, Rule::NoneTerminal(vec![vec![42], vec![42, 8]])); + rules.insert(11, Rule::NoneTerminal(vec![vec![42, 31], vec![42, 11, 31]])); + + let count2 = input_lines + .iter() + .map(|l| { + if (true, "") == match_rule(l, 0, &rules) { + 1 + } else { + 0 + } + }) + .fold(0, |x, y| x + y); + + println!("Answer2: {}", count2); + + Ok(()) +} + +#[cfg(test)] +mod tests { + use crate::*; + + #[test] + fn test_read() { + assert_eq!(read_rule("5 : \"a\""), (5, Rule::Terminal('a'))); + assert_eq!( + read_rule("3 : 2 4 | 1 2 3 | 5 7"), + ( + 3, + Rule::NoneTerminal(vec![vec![2, 4], vec![1, 2, 3], vec![5, 7]]) + ) + ); + } + + #[test] + fn test_example() { + let rule_str = r#"0: 4 1 5 + 1: 2 3 | 3 2 + 2: 4 4 | 5 5 + 3: 4 5 | 5 4 + 4: "a" + 5: "b""#; + let rules: HashMap = rule_str.lines().map(|l| read_rule(l)).collect(); + + let inputs = r#" + ababbb + bababa + abbbab + aaabbb + aaaabbb + "#; + + let in_lines = inputs.lines().map(|l| l.trim()); + let mut count = 0; + for line in in_lines { + let (matched, rest) = match_rule(line, 0, &rules); + if matched && rest == "" { + println!("Matched: {}", line); + count += 1; + } else { + println!("Not matched: {} {:?} {:?}", matched, line, rest); + } + } + + assert_eq!(count, 2); + } + + #[test] + fn test_loops() { + let rule_str = r#"42: 9 14 | 10 1 + 9: 14 27 | 1 26 + 10: 23 14 | 28 1 + 1: "a" + 11: 42 31 + 5: 1 14 | 15 1 + 19: 14 1 | 14 14 + 12: 24 14 | 19 1 + 16: 15 1 | 14 14 + 31: 14 17 | 1 13 + 6: 14 14 | 1 14 + 2: 1 24 | 14 4 + 0: 8 11 + 13: 14 3 | 1 12 + 15: 1 | 14 + 17: 14 2 | 1 7 + 23: 25 1 | 22 14 + 28: 16 1 + 4: 1 1 + 20: 14 14 | 1 15 + 3: 5 14 | 16 1 + 27: 1 6 | 14 18 + 14: "b" + 21: 14 1 | 1 14 + 25: 1 1 | 1 14 + 22: 14 14 + 8: 42 + 26: 14 22 | 1 20 + 18: 15 15 + 7: 14 5 | 1 21 + 24: 14 1"#; + let mut rules: HashMap = rule_str.lines().map(|l| read_rule(l)).collect(); + rules.insert(8, Rule::NoneTerminal(vec![vec![42], vec![42, 8]])); + rules.insert(11, Rule::NoneTerminal(vec![vec![42, 31], vec![42, 11, 31]])); + + let inputs = r#" + abbbbbabbbaaaababbaabbbbabababbbabbbbbbabaaaa + bbabbbbaabaabba + babbbbaabbbbbabbbbbbaabaaabaaa + aaabbbbbbaaaabaababaabababbabaaabbababababaaa + bbbbbbbaaaabbbbaaabbabaaa + bbbababbbbaaaaaaaabbababaaababaabab + ababaaaaaabaaab + ababaaaaabbbaba + baabbaaaabbaaaababbaababb + abbbbabbbbaaaababbbbbbaaaababb + aaaaabbaabaaaaababaa + aaaabbaaaabbaaa + aaaabbaabbaaaaaaabbbabbbaaabbaabaaa + babaaabbbaaabaababbaabababaaab + aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba + "#; + + let in_lines = inputs.lines().map(|l| l.trim()); + let mut count = 0; + for line in in_lines { + let (matched, rest) = match_rule(line, 0, &rules); + if matched && rest == "" { + println!("Matched: {}", line); + count += 1; + } else { + println!("Not matched: {} {:?} {:?}", matched, line, rest); + } + } + + assert_eq!(count, 12); + } +}