diff --git a/inputs/day19.txt b/inputs/day19.txt new file mode 100644 index 0000000..b3a2923 --- /dev/null +++ b/inputs/day19.txt @@ -0,0 +1,598 @@ +108: 117 50 | 63 64 +124: 50 64 | 64 64 +123: 64 119 | 50 85 +45: 60 64 +32: 20 50 | 79 64 +36: 97 64 | 70 50 +97: 50 64 | 64 50 +21: 50 104 | 64 83 +59: 50 124 | 64 83 +10: 115 64 | 34 50 +118: 50 124 | 64 4 +60: 12 50 | 4 64 +84: 29 64 | 99 50 +111: 64 27 | 50 14 +18: 64 101 | 50 29 +13: 64 45 | 50 1 +62: 64 97 | 50 83 +117: 124 64 | 70 50 +98: 50 4 | 64 124 +15: 64 114 | 50 12 +7: 100 64 | 56 50 +78: 99 50 | 52 64 +82: 114 64 | 97 50 +22: 6 64 | 4 50 +63: 12 50 | 114 64 +16: 64 52 | 50 70 +76: 50 46 | 64 13 +31: 64 69 | 50 67 +37: 21 50 | 128 64 +95: 68 64 | 16 50 +12: 64 50 | 50 30 +26: 50 12 | 64 83 +112: 113 50 | 72 64 +33: 104 64 | 52 50 +25: 70 64 | 114 50 +96: 51 64 | 105 50 +51: 50 47 | 64 26 +91: 103 50 | 9 64 +65: 66 64 | 23 50 +116: 64 114 | 50 97 +42: 64 54 | 50 40 +4: 50 64 +79: 50 97 | 64 29 +110: 64 116 | 50 118 +0: 8 11 +73: 50 12 | 64 101 +70: 50 50 | 64 50 +74: 61 50 | 65 64 +27: 50 107 | 64 90 +101: 30 30 +105: 17 50 | 24 64 +61: 58 64 | 102 50 +17: 50 83 | 64 29 +72: 30 97 +88: 64 38 | 50 2 +14: 50 36 | 64 2 +125: 64 50 | 64 64 +127: 95 64 | 28 50 +83: 64 64 +80: 64 107 | 50 81 +106: 50 101 | 64 29 +56: 88 64 | 49 50 +52: 50 50 | 64 64 +46: 80 50 | 120 64 +94: 68 64 | 33 50 +47: 50 114 | 64 6 +69: 44 64 | 57 50 +54: 74 64 | 3 50 +89: 50 83 +48: 106 64 | 59 50 +87: 86 50 | 37 64 +35: 64 73 | 50 55 +115: 50 99 | 64 70 +44: 111 50 | 109 64 +75: 78 50 | 22 64 +20: 64 101 | 50 6 +41: 50 4 | 64 101 +6: 64 50 +66: 50 93 | 64 115 +90: 64 101 | 50 124 +23: 50 82 | 64 77 +81: 50 114 | 64 101 +30: 50 | 64 +100: 122 50 | 75 64 +86: 50 73 | 64 18 +92: 64 48 | 50 71 +68: 6 50 | 114 64 +121: 50 70 +8: 42 +85: 64 112 | 50 110 +38: 64 104 | 50 4 +120: 84 50 | 55 64 +67: 64 7 | 50 53 +64: "a" +55: 50 52 | 64 125 +28: 89 50 | 84 64 +71: 50 39 | 64 16 +109: 43 64 | 94 50 +99: 50 50 +43: 41 64 | 77 50 +119: 64 108 | 50 35 +57: 87 50 | 96 64 +39: 64 97 | 50 6 +104: 50 64 | 64 30 +29: 50 64 | 50 50 +34: 83 50 | 125 64 +2: 99 64 | 124 50 +11: 42 31 +114: 64 64 | 30 50 +93: 50 97 | 64 101 +58: 50 33 | 64 121 +113: 64 99 | 50 70 +128: 64 4 | 50 125 +40: 123 64 | 76 50 +107: 50 52 | 64 83 +102: 126 50 | 25 64 +126: 50 125 | 64 97 +19: 50 124 | 64 114 +24: 114 64 | 29 50 +49: 20 30 +1: 64 19 | 50 15 +103: 26 50 | 18 64 +9: 64 117 | 50 62 +50: "b" +53: 91 64 | 5 50 +77: 6 64 | 99 50 +5: 32 64 | 10 50 +3: 64 92 | 50 127 +122: 115 64 | 98 50 + +bbabbaaabbabbaaaabbbbbbb +bbaabaaaaabbbaaaabaaabba +baabababbbbaaaaabbabaaba +baaabbbabaabbaaababaabbaaaaabbbb +bbbbaabbbabaabbabaabaaaa +aabaaaabaababbbbababaabb +bbabbbaaabbbbabbbbabbabbbbbbbbabaabaaaabaabaabbabbabbbbbaabaaaba +baaaaaaabaabbbaaaaaababb +aaabbabaaabbabbbabaaabba +abbbbbabbababaabbaaabbbaababbbbaababbabb +bababbaabbbbbbaababaaabaaabababbabababba +babbaabbbabaabbbbbaaabba +abbbbbabbbbaababbababaaa +aaabaaababbaaabbbbbabbaaaabbbbba +bbaabaaaabbbaaaabbabbbab +baabaabababbaaababbababa +abbbbbabababaaabbbbbbbba +aababbbababbababaaababababbbbbbabaaabaaa +bbbbabaabbabaabbbbabbbaa +aabaabbbbbbababbbabbbaba +abbababaabbbaabbbabaaaababbbaabababbaaaaababbaabbbaabbabbbabaaabbaabaabbbbaaabaa +baababaaabababaabaaabbabbbaaaabbabbabaab +bbbaaaaabaababaaaaabbaaabbbababbaaabaaba +bbababbabbbbbbabbbbabbbbbaabbbabaabbbbababbabaab +abbbbbabbbabaabbbabbaabaaababaab +bbbbabbbbaababaaaaabbbbabbabbbbbbabbbbaaabaabbabaabbabbb +abbaabbabaaabaaaaabbbbaaaaabbbbb +aabaababababbbabbbabbbaabaaaabaaaaabbbbbaabbbabbaaabbbab +abaabaaabababbaababbabab +aabaaaabbbaababbbbabaaab +bbbababbabbbbabaaaabababbbabbbabbbbaaaabaaabbbbbaabababbbbababbbbbabaabb +aabbaababaabaaaaabbbbbabbbaaabaaaabaabab +baabbaaaaaaabbabbbababab +abbbabaabaabbbabbabaaaabaabaaaababaabbbb +aabbbabaaabababaabbababb +abababbbabaaabbaaaaaaababbabaabbbabbaaaabbbbbaab +abbabbaabbbaabbbabbaabaa +baabababbaabbaaabaaababb +aababaabbbabbababbaabababaaaabbabaabbaab +bbaaaabbbbbbababaabbbaaaabaabaaabbbbbbba +abbaabbbbaababaaaabaabaa +aaaaaabbabbaabbbbaabbabb +bababababababaabaaabbaabbababaababaabaabababbaba +ababbbbabbbbabaaabbbbbba +babaaabaaabbababbabbbbaa +bbabbbbabbbbbbabaaababbbaaabbabbbabbabbababbabbbbaabbbaabbababaa +bbaabaaaaabbbabaabbabbba +babababababbaabaaabbbbbb +baabbbabaabaabbabaabbbbb +babbbbababbaaabbbaaabbaabababbaabababaabbbbbaaabaaaaaaaa +aabbbabbababbbbaaaaaabaa +bbbababbababbbbabbaaabba +aabbabbaababaabbbbaababa +abbabaaabbbaaaaabbbababaaabbababbabbbaab +babaaaaaaababababbbabbbbbbbbbbaa +abaaababbabbbbbabaabaabb +babbbabbabbbbbabababbbbaaababbab +aaabbbbabababaabababbbbaabababab +baaabaabbabaaaabbababbaabbbabbbaabbbabbb +babaaabbabbabbabbabbbaba +bbaabbbababbbbabaaaabaaaaabbabababaabaab +abaaabaaabaabababbaaaabbbabbabab +bbbaaaababbabbabaaaaabab +bbbbababbaaabbaaabaabbbb +abbbbabbbaaaaababbbbbbba +bababbabaababbbbbababaaa +bbababbabbbbabbbbbababaabbbbbbbbabbbbabbbbaababa +baaaaababaabababaabaaabb +baabaababaaabbaaabababab +baaaaaaabbbababbbbbaabbbaababaaa +ababaaabbabaabbbabababba +baaabbbaabbabaaabbaaaaabaaaabbabbabbbbbbbbbaabaa +bbbababbabbbaaabaababaab +aaaaaabbaabbbaaabaaaaabb +babaaabbbbabbaaabbabbaab +aaabbaabbbababaaabaabaababababab +aaabaabbbabbaaaaababaaabababaabb +bbaaaabbbaaabbbaaababaaa +bbabbbbabbbaababbabbabba +baabababaaababaababaaaaaaababbab +baabbaaaaaabaaabbbbbaaaa +babbaaababaabaaaaaaabbbb +babaaaaaaaaabbabaabbababaabbabbaababaaabbbaabbaaaaabbbbb +abababaabbabaabbbaabbaaabbaaaaaa +bbbbbbaaaaabbabbbabbaaaabaabbbaababbbbbbbaabbbbaabbbababaabbaaababaababbabbbbaaaaabaaaaaaabaabab +bbababaabbbbaabbbbaabbbbbbbbbbbabbbaabbabbbbbabbabaaabaaaaabaaaa +abbbaabbbbbaabbbbabaabaabababbbbabaabbab +babaababaaababaabbaabbbbaaabaaabaaababbbabbbaaaabbabbbbbbbaababaabaabbbbbbbbbaaaaaababaa +babaabaababaabaabbaabbbb +bbbbbaaabbababaaabaabbaaaaaaabbbabbabaabbaaaabba +babbbbbbaaabbbabbbbabaaa +abaabaaababbbbabaababbab +bbaaabaabaaaaaaaaaabbbabaabbbbbb +aaabbbabaaaaaabbaabbaabbbaabaabaaabbababaaabaaababbbabab +aaabbaabaabbabaabbbbabbabaaabaabbaabbabb +babababaabaabaaababbaaba +babbbbbbabababaabaabbaba +baabbbabbbaaaaabababbaabaabbbbaaababaabaabbaabaaaaaabbaabbaaabba +abbbabaaabbbaabbbbaaabba +baabbbabaabbbbaaaabbbbbb +bababbabaaaabaaaaabbbbaaababaaaaaaababbaaaabbbbbabaabbab +abbaabbbbbabbbbbaabbbaab +ababbbabababbbaaaabbbabbbbaabaabbbbaaabbbaababbaaaaabbbbbaabbabb +aaababaaabbaabbbabbbbaaa +bbbababbbabbbaaaaabbbbaabaaabbaabbabababaaaaabaa +babaabaaabbaabbbbbbbabaaabbaaabbbaababbaabbbbbbbbaabaaaa +bababaabaabaaaabbaaaabba +baabbbbabaabababbaaabbabbbaabbbaabbbbabaababaaaaababbabaaabaabaaaaaababb +aabbbabbbbabbaaaaaaaabba +bbbaaabbaabbababbaabaaaa +abbbbbababbaabbbbaaabaaabbbbbabbbaaababaaabbaaababaabaaabbbabbaabbbbbbababaababb +babbbbbbababbbaabbabbbab +abbaabbaaababbbabbaababa +aaabbbabbabaabaaabbaabbbabbaabbbaaaaaaaa +abbbbabbbbbbabababbaabab +bbbbababaaabababbbbbbbba +bbbabaabababbbabbaaaabbbbababbabbabababa +aababababbbababbbbaabaaaababbababbbbaaaaabbbbabaabaababbabbbaaabbabbaaaabbbbababbabaabab +aabbaaabababbbaaabbaabaabababaaaaaaabababbabaaab +bbaaaaabbabbbbbabbabbbab +babbaababbbbabbbbbabaaab +aabababaaabbababbbbbaaba +babbaaaabbbaabbbbbbbabaaabbbbbba +bbaabaabbbabbbbaabaaababbaabababaabaaaaa +abaaababbababbaaabbbbbbb +bbaaaabbabbabaaaababbabb +aaabababaababababaaabbbb +ababbaaaabbbaabbbaabababbaaabbababbabbbabbaaabbb +aababbbaabababbabbabbbabbbaabababbbaababbabaabbabaababaa +baaabbbababbbabbbbaabaababbbbabbbabababbaabbbbba +aabababbaababbbbabbbaaaababbbbabbbbaaabbbabbbabaabaababb +baaabbabababbaaabaaaabab +aababbbaaabaabbaababbabb +aaabbaaaaababbbbbaabbbbbbaaaabaa +bbbbbaaababaabaaabbaabbbbbabbbabaaaaabab +aababbbbaabaabbabbabbaab +bbbaaaabaaaabaababbbbbbb +abbabaaaaaaabaaababaaabaaaababbbabaaabbb +abbbaaabbabababaabbbbbaa +baababaaaaababababababaabaaabbbaabaabaaa +bbbbbbbbababbbbabbabbaab +ababbaabaabaabbbabbbbbbb +babaaababaabbaaaabbabbaaababbababbabbbaaababbbabbbabbbabbabbbabb +babaabbabbbaaababbaaaaaa +bababbbaabababaabababaabaaaaaabbbbbababa +bbbbaabbababaababaaaaaab +ababbabbbabbbbaabaabbbbb +aabababbabababbaababaabbbbbaabaaabbbbbababbbbbabbbbbabbbbababbabbaababaa +ababbbababbabbaabaaaaabb +babaabbbbabbabbbaaabbaabbaabbbababbbabba +abbbaaabbaababaabbabaaba +bbbabaabbabaabbbaabaabab +ababbaaaaabaaaabbbaaabab +baababababbabbaabbababab +abbbbbabbbbbaabbaaaaaaab +baaaabbbaababaaaaabaaabbababbababaaaaabbbaaaabaa +bbbaaabbabbbaaaababaaaaa +bbbbaabbbbabbaaabbaaaaba +aaaabbabaaabbabbaaaabbba +abaabaaabbbaaaababbaaabaabbbaaabbbababaaaabbaabbabbabaababbabbbb +aaabaabbbbaabaababbbaaababbbaaba +baaabbbbbabbababbabaabab +babbbabbabbabaaaaaaaaabbbbaaaaaa +ababbaaaabaababaaaabbbbb +bbbaaabbbaabaababaaabbaabbbbbbaaabbbbbaa +ababaaaabbbbbbbbabaabbaa +bababaababbbabaaaabbabaa +babbabaababbaaabbabbbbaababaababbbbaaaaaaaabaabaaaaaababbbabbbbaaaabbbaa +baaabaaaabbbabbabaababbb +babaaaaabababababaabbaabbaabbbbabbabbabbbbaaaabababbabbbaabbbaaa +baabaababbaabbbaaababbab +aabaabababaabbbabbbabaaaabaaabaababbabbbaaabbbbbbaabbbaabaaabbbbaababbbbaabbaabb +aabbbabbbbaabaaabbbbbabb +aaabbaabaabbabbabaaaabba +baaabbbaaaabbaaababbabba +abaabbbababbbbababbaaaaa +bbaaabaaabbbbababbbaababbbbbbaaaabbaababaaabbbbb +ababaaaabbbbbaabbababaabbbabbaaabbbbaaba +aabbabaaaabbbabbbaabbbbaababaababbbabbbbabaaabaabbaaaabbaabaaaaa +bbbabbababbaaabbbaabbaaabaabbbaaaabbbbaabbababaaaabababb +babaaababbbbbaaaaabaaabb +abbbabbabbbbaabbbbabbbaa +bbbbabbbababbaabbbabaaaa +abbbaabbbbbbbaaaabbababa +bababaabbbbbbbbbaaaaabbb +babaaaababaabababbaabbaa +abbbaabbabaababaabaaabaaabbbabaabbaababa +bababbababbabbaabbaaaaaa +babbaaaababbaaabbbabaaaa +bbbbbaaaaabbababaaaaabaa +abaababaabaaabaaabaababb +baabbbbababbaabbbbbbbaba +bbabbbbbbbaaaaabbbaaaaabbaabbbaabbbbaaabaaaabbaa +aaabbbaaaaaaabbbaaabaabbaaaaaaaabbbaaabbbbbbbaba +aabbbababbababbaaaaaabbb +bbaabaaaabbaaabbabbabbababaaabbabbaaabba +babbaabbabbbbabbbabbbaaabbbaabbbbabbbaababaabbabbabbbbaa +bbbaabbbaababababaaaaaab +bbaaabaababaaabbaabbabbb +aaabaabbbbabbbbbababaabb +babaabbbbbbaababaabbbabbabbbabaabbabbaaababbabba +babbbbbabaaabbbaaaaaabab +aaabbbbabbababaaababbbbb +abbbaaaabaaaaababbabbaba +baabaaabbbbabbbbaabbbbaababaaabbabaaabba +ababaababaababaaaaabbbaa +baaabbabaaabbaabbbbbabaaaaaabbaaaaaabaaabaabaabaabaaabbaaabbababaaabbababbaaaaba +baabaabaaaaaaabbabbabaaabbabaabbbbabbbbabbabbaabbbabbbabbaabaabb +aabbbaaabbbabbbbbbbbbbba +aaabaabbaababbbabbabaaaa +aaabbabbabbbbbbaaabbbbbbabbbbaaa +aabbbbaaaabababaaababbbaaaabaaaa +bbaabaabbbbbbabababaababbbbbabaabbbbabaaabbabaab +aaabaabbaabbabbabaaaaaab +baaaaabaababbbabbbbaaaaa +ababbaabaaabaabbabaaaaba +baabaabaabababaababaaabbbbabbabb +baabbbabbbababbaaababaaa +aabaaaabaabaaaabbabababb +babbaababaabaaabaaaabbba +abbaabbbaabbbaaabaaababa +aabbbabbaababbbbbbaababbbbbbbbaaabaaaabb +babbabbaababababbaaaabbbbaaaaaabbaaabbbbababbbabaabababa +baabaaabbababbabbbaababa +babbbabbbbabbbbbabbababa +aabbababbbbbbbbbabbaabab +bbbbbaabaabbabbaabaaaabb +babbbbbbbabaaaabaabbbabbbabaabbbbbababaabbbbaabbabaaabbb +bbabbbbaaaababbabaaaaaab +abaaaabababaabbaababaabb +aaabbbabababbaaaaabaabbaababbbaabaaabbab +aaaabbabbababbbabaabbaab +bbaaaaabbbaabaababbabbba +baaabaaabaabbbbaaabaaabb +aababbbbbbbababbbaaabbbbbbaaabba +aaaabaaabbbbbbbaabaabbab +aabaabbabbbaabbbaabbabbababaabbababbaaabaabaabaaabaaabba +baababaabababababbbbbaba +bbaabaaabaaabbababbababa +abbbaaaaaaababaabaaabbaabaaabbaaaabbaaba +abbabbabbbbaaabaabaababb +babbabbbaabbbaaaaaaababb +bbbabababbaabaabaaabaaaa +bbbabaaabaababbabbaaabbaabaabbaa +baaaaababbbbbaabbbabbabb +baabababbaaabbbabababbaaababbabbabbbbbbb +abbbaabbabaaaaaaabaaaaaaaaabbbbababbaaaaababbababaabbbbbbabbbaababbbbaaa +aaabbabbbaaaaaaabababaababaaaaab +babaaaaaaabbbababbbbabbbabbaabbbaaabbaaaaaaaaaab +aabbbabbbababbaabbbababaabbaabbabaaaaabb +babbaaabbaabbbaabaabbabb +abbaabbaaabababbababbaba +abbbbbabbbbbbbbbbaabbabb +bbbaabbbbabaabaababaababbabbbabaaabaaabb +baabbbbabbbbbbbbbbbbaabbababbabb +aaabbbbaabbabbaaaaaababa +aabaabbabbbaaabababbbbbaaaaaaababaabbaba +abbabbabbaabbbabaaaabbaabaabbabbababbbbbbbaaaaaaaaaababbbbbaaabaaabaaaaabaaaabaa +aaababaaaabbababbaabbbaabaababaaaabaaabaaaaabbaa +baabaaabaaaaaaaaaabaaabbbbbbaaab +abaaabaaaaaaaabbbbaaaaba +babbaaabbbaaabaababbbaba +babbbbbabbaabaababbababbbabbabbabbbbbaba +aaaaaabbbaaaaaaaabaaaabaabbaabbaabbabbbbbbababbbaaaabbbb +bbbaababababbaabbbbabaaa +aaaaabbabbaaaaabaaabbaabbbabbabaababaabbababbaaababbabaabbbaaabbabbbbabb +babaabaaaabbbaaaaabbaaab +bbbbabbbbaaabbbabbbaababaaabbaabbabbbaba +aabaabaaabaaaabbabbabababaaabbabbbaaaabbbbbbaaaaababbaabaaabaabaabbababb +ababbaaaababbaabbaaaabbabababaababbaaabb +abababababbbabbbaabbbaababbabaab +babbbbabbbbababbbbbbbbabbbababbb +aababbbbabaaaabaaabaabab +bbbaaababababbababaababb +bbbabbbbbabbbabbaabaabab +baaababbaaabbbaaabbbabaaabaabaaaaaaabaaaabaababa +bbbbbbbbbbabbbbbbbbbbbabaaabbbaaabbbbaab +babbabbbbbbbabbbbbaaabba +babaaababbbbabaaaaabaaabaababababbabaaab +abaababaababbaaabbabbbbbabbabbab +bbbabbbbaabaaaabbbabaabbaaababbaaababbbbabaaaabbbbbabbbabaaaabab +babbbbbbaaabaabbbbbabbbbbabaabaaabaaabaabaaababa +abbabbababbbbababbabaaab +ababbaaaabaaabaabbaababb +aabaaaabababaaaabbbbaabbabbbaaaaabbaaaab +babaaaaaabbbaaaabababaababbbabbababaabaababbbbaaaabaabab +abaaaaaababbaabaabbaaaaababbaabbbabbbbbbbaaaabbbabaabbabbbabababaaababba +aabbbabababbaabbababbabb +aaabbaaaabaabbbaababaabb +bbaabbbabbbbababaaabbbabbbbbabbabaaaaaabaabbbbaaaaabbaabbaaaaaaa +babaaaabaaabbabbaaabbaba +aabbbbaabbbabbaabbbbbbba +bbaaaaaaabaabbaaaabaaaba +abbbaaabbabbbbbbbbbbabaababaaabbbbaabaaaabbbbbbaabaabbaaabbbababbbbabbba +abbaabbbaabbabababaaaabaabbababbabbbabbb +abbaaabbbbaabaaabbbbabbbbabbbbbbbaababbb +bbabbbbaabbbaaaabbbaababbbababbababbabba +abaaabaaabaabaaabbabbbaa +aaabbbabbbbbababaaabaaba +aabaabbabbbaaaabbabbabba +abbaaabbbbaabaabbababaaa +aabbabababbaaaaaaaaaabbbabababaabbbaaabbbbbaaaaa +aaaabbabbaababaabaaabaab +bababbaaaaabbaaaabbabbbb +abbaabbbabaaababbbbaababbabbaaaaabbbaaababbaaabaabbbbbba +aabbbabaaaabaaabbaaaabaa +bababbaabababbaabaabbaba +bbaabbbbbbbbaaaaabaabbbb +bbbbbbabbabbbbbaabbbbaaa +bababbbabaaabaaabbbabaab +baaaabaaaabbbbabbabbabbaaaaabbaa +bbbbbbabbaabbbabaabbbaab +baabaabaabbbaabbaababbab +aaabbaaabbbbababaabbababbabaabbaabaabbbabbbabaab +baaaaaababbbbbbabbabababbbaaabbbaabaaaababbbabbbaababaabbbaaaaabbaabbbbbabbababb +abbbabbabbaaabaabaaabaab +abaabbbabababbabababaabaabbabbabaabbaaaabbbbaaaa +bbabbabbbbbbaaabaabaababababaabbabababba +abaabbabbababaaabbabbababbabaaaababaaaaaaaaaabaabbbbaabbbbbbabaaaaaababbbbabaabaaababbba +bbaabbaabbbbbbabbabaaaabababaabbabbabbabbabaaabb +abbbaabbbbbaabbaabbbabab +bbbbbaabaaaabaabbaaababbabaaaabbabababbb +aabbbbbabaabaababaaabbaaaabaabbaabababbbaaabbbbb +aaaabaaabbbabababaaabbaaaabbabababbaababaababbaaabaaabba +bbbbabaaababbaaabbabaabbbabbaaaaaaaaaaab +babbaaaababbbbbabbbabababaabaabb +baabababbbbbabbbabbabbba +babaabaaaaabbaaaaaaaaaaa +bbbaaaabbabbaabbbabbbaba +abbaaabababbbaaabbaababb +aaababaabbabaabbbababaaa +baaabbaaababbabbbabaaaaaabaabbbbaaabaabaababbbbbbbaaaabbaabbbaabababbabbababbaaa +bbaabaabbbbababaaabbaabbaaabababbbbabaaaaaaaaaabbaaaaabbababbbbb +aaababbaabababaabbbaaabbbbabbaab +aabbbabaabbbabaabaabaaaa +ababbaaababbaababbabbaba +babbabaabbaaabbbabbbaaaaaabaabababaabaaaabaaabbbabbaabbbbabbabbbabbbaaab +ababbaaaababbaaabbbbaaba +bababbaabaabaaababbaabab +babaabbaaabaabbaabbbbabbaababbbabaaaabaaaababaab +babbbaaaabbbbbabaabaaaabbbabaaaa +abaabaaabababbabbbabaaab +babaabbabbbbabaaabaaaabaabbabbabaaaabbab +aaabaabbaabbbababbabbbbbaaabaaaa +ababaababbbaabababbaaaaabababbbbaabbaaba +aabbbabbabbabaaaabaabbab +bbabbaaabababbaabbababbb +baabbababbababbaaaaabbbbaabbbabaabaabbbbbabaabaabbbbbaaa +aababbbabaaaaaabbaaabaab +bbbbabbbaaaabaaaababaaaabbaaaaaaababbabb +baababbbaabaababbbababbbbbbaababbbbbaaabaaabbababbabaaaaababaaabaaaaabbabbbababb +baababaabbbabbbbbaaaabab +abbaaababbbaaabbbabababb +bbaaaaabbabbaabbababbabb +aabaabbaababaabaaaabbaba +bbbaababaaabbbbaabbaabbbbaaabababbbbbaba +bbaabbbabbaabaabaaaaabaa +aabaaaabbaaabbababaabbbabbbaaabbaabaaabaaaaabbba +babbaaabbaaabbaabbabbabb +bbbaababaaabbbabbabaabab +aaababaabbaaabaaaabaabbaabaabbab +aaababbaabaabaabbaaaaabbbbabbaaaaaaabbababbbaaaabaabbaabaabbaabbbbbabbab +aaaaaaaaabbaabaababbbbbababaababbabbaabbababbbabaaaaaabaabbbabab +baaaaabbabaaaabbaaababbabaabbaababbbbbabaaababbbbbbbbaaaabaaabababbababbabbabaababababab +abaaaaabbaabababbabaaaababbbaaaabbaaaaaa +ababaaaabbbbbaaaababaababaabbabbbbaaabab +bbaaaabbaabbbabbabbaabab +baabaabaababaabaaaabaaba +baabbbabbbaabbaabbababaabbbaaabbbaaaabaabaabbbbbaabbabaaabbababbbbbbbaabbabbaaabababaabb +aaaabaaaabbaaababbabbaba +aabababbaaabbbababaababb +ababaaabababbbabbbabbbab +abbbabbaaaababaabaaabbaaababbbbaaabbabbaaaaaabaabaaabbbbbbaaabbaaaaaabba +baaaabbbbaabbababbabbbabbabaaaba +baabaabaaaaabbabaabaabbbbaaaabbaabaaabbb +abbaabbbababbaaababaaababbbaaababaaaaaabbbababab +aabbbbaaaaaabaababbaaaababaaabbbaabbbaaaabbbbbababbbaabaaaaabbabaaaaaaaa +baaaaaaabababaabababbaba +bababbbaaabbababbbaaaaba +aaababbaaabbabbaababbbbb +aabababbabbbbabaabbabaaaabaabbbabbababbabababbabaaaaabba +abbababbbaabaabbbaabbaaaabaaabbaababbbbbbbbbbabbaababbaabaabaababbbabbabaabbabbbbbaaaabbbbbababb +aabbabbaabaababaaaaaabba +aabbababaaababbaabaabbab +abbbbbaababbaababbababaabbaaaaaabaaabababaaaabbbbbaaabbb +aaaaabbabaababbaaabaabaa +babbbaaabaabbbbababaabbaabaaaaabbbabbbaaabbbabbbbabbbbaa +aaaabaabbabaaaababababba +abbbabbbaaaaabbbbbaabbaa +bbbaaaabbbaabbbababaaabbbbababaabbaaaaaa +aaaabaabbbbaaaabbbbabbab +aababbbbbaabababbbaaabba +baabbbbababbbabbaabbabbabbbababbaaaaabab +bbabbbbabaabbaaabaabbbbb +ababbaabbbababbabbababab +aaabababbbbababbabaaababbbabaaba +aaabababbaaabbbabbabbabb +bbbbbbabaabaaaabbbaaabab +abbabbaabbbabbaaabbaabbbaabaababaababbab +abbaabbababbaaaaabbaabbaaabaabbaaabbaaba +ababbbabbaababbbbabbbbaaaabbaaabaaaaaaab +baabbbbaaaababbbaabbbbbaaabaaaaa +bbbababababbaabaaaaaabaa +baabababbbbaabbababbbbbaaaababbaabaabbbaaabbabaabbaabbbb +aabbbaaabbbbbaabaaabbaba +babbbabbaabbaabbbaabbaab +bbbabaabbbbaabbaaaabbabbaaabababbbabbaaaabbbaabbbaaabaaababababb +bbbaaaabbbabbbbabbbabbba +aabbbabababaaaaabbbabbaaaabaaaba +bababbaababababaabaaaabb +bbbaaabbbbbaabbabbbbbbaabbaabbbb +abbbaabbbababaabbbaaaaba +abababaabaaabbbabaaabbabbabaaaabbbaaabab +bbbabbbbbbbaaaaabbbbababbbabaaabababbbbb +abaaaaaaababbaababbaaabaabbaaaab +bababaababbbabbabbabaaba +babbaababababaabbbbbbbbbabbababbbababbbb +bbbaaabbbbababaababbbaba +aaabbbbaabbbababbababaaaaaabbbbaababbbbbabaaababbbabbbaaaaaaaabaaaaaabaa +bbaabbbabbbbbbaaaaaaaaab +baaabbbabbbaaaaaaabbaaaa +aaaabaaaaabaabbaabbabbbb +abbbbabbbaababaaabababbbbaaabaabaaaaabaabbbbabbaabbabbbb +aaaabaabbbababbababbaabbbbabaabbbbbbaaab +bbbbbaaabbbaababbbbababbbbabaabbaabbbbba +aaabbbbababbbabbbbbaababbbbbbbbbbbabaabbaaaaabaa +aabbbabaababaaabbabbbaba +bbbaababbbbbbbbbabaabbaa +ababaaababbbbbabaaaaabab +bbbababbbababbbaabbababa +bababbbaabbbabbababbabaa +bbbababaabaaaabaaaaabbbb +ababaaabbbbaaaabbbabaaba +aaababaabbbaaabbbbbaaaababbabbbb +babbbbabbababbaaababaaaaabaababbabbbabbb +bababbabbabbabbbaabbababbaabbaaaaabbbaabaabbaabbbbaaabbaabbabbbabbbbbaab +babbaababaaabbaaababaaaabbbaabaa +bbabbbbabaabababbaaabaab +abbbaaabaaababbaabaabbab +bbbababbbbbabbbbbbabbabb +bbbbbaababaaaabaababaabb +abbabaaaabbbaaaababbbbab +ababbbabaaabbbabaabbbbaaaaabbbbbaabaaaba +bbaaabaaaaababaaabaabbbb +abaaabaababaaabbbaaabbaabbbbabaabbabbaab +bbbbbababbabaababaababbbaabbaabaaabaaaaaaabbbbba +aabbbabbabbaaababbababaabbbabababaaaaaaaaabaabaabaababba +abaaaababbbbbbababaabbbabbbaaaaaababbabb +babbbbbaaaaabbabbaaaaabb +aaabaababbaabbaaabbbbbabbbbababbaabbbbbababbbaab +abbabaaabbbabbaababbaabbaabbbbba +babaaabaabbbabbaaaaabbaa +baabbbbabaaaaababbbaabbbaaaabbbb +aabbaabbbbbaaaabbbbabbaaabbabbababbbbaababaababb +abaaaabbbbaaababbbbbbabb +abaaaabaababbbabaabaaabb +abaababbaabaababbaaabbbb +bbabbabbabababbaaaabbabaabababab +aaaaaabbbabaaaabbbbbbbaabaaaaabbaababbabbabbbababaaaabba +bbababbabaaababbababbbbbbabbabab +bbabbaaababbbbaababbaaab +baaaaaaaaabababbaabaabaa +abbaaabbabbbaaaababaaabaababaabaababaabb +abaaaaabaaababbaaaabaaab +abaaaaaabbaabaaaaaabbaabababbbaaabbbabbbbaabbaab +abbaaabbbbaabbaaaabbbaaabaabaaaa +aabaaaabbbbaaaabaaababbb +abbaabaabbbbababbabbaaababaaabbaaabaaaabbabababababababb diff --git a/inputs/day19_test1.txt b/inputs/day19_test1.txt new file mode 100644 index 0000000..a76d890 --- /dev/null +++ b/inputs/day19_test1.txt @@ -0,0 +1,12 @@ +0: 4 1 5 +1: 2 3 | 3 2 +2: 4 4 | 5 5 +3: 4 5 | 5 4 +4: "a" +5: "b" + +ababbb +bababa +abbbab +aaabbb +aaaabbb \ No newline at end of file diff --git a/inputs/day19_test2.txt b/inputs/day19_test2.txt new file mode 100644 index 0000000..0962991 --- /dev/null +++ b/inputs/day19_test2.txt @@ -0,0 +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 \ No newline at end of file diff --git a/src/bin/monster_messages.rs b/src/bin/monster_messages.rs new file mode 100644 index 0000000..c6784d8 --- /dev/null +++ b/src/bin/monster_messages.rs @@ -0,0 +1,218 @@ +use advent2020::errors::{GrammarParseError, TopLevelError}; +use std::collections::HashMap; +use std::env; +use std::fs; +use std::str::FromStr; + +struct Grammar { + rules: HashMap, +} + +impl Grammar { + fn new() -> Grammar { + Grammar { + rules: HashMap::new(), + } + } + + fn add_rule(&mut self, number: usize, rule: Rule) -> Result<(), GrammarParseError> { + if self.rules.insert(number, rule).is_some() { + Err(GrammarParseError::DuplicateRule(number)) + } else { + Ok(()) + } + } + + fn parses(&self, s: &str) -> Result { + self.accepts(0, s) + .map(|x| x.iter().filter(|x| x.is_empty()).count() > 0) + } + + fn accepts<'a>(&self, rule: usize, s: &'a str) -> Result, GrammarParseError> { + match self.rules.get(&rule) { + None => Err(GrammarParseError::UnknownRule(rule)), + Some(v) => self.rule_accepts(v, s), + } + } + + fn rule_accepts<'a>(&self, rule: &Rule, s: &'a str) -> Result, GrammarParseError> { + match rule { + Rule::Alternatives(alts) => { + let mut results = Vec::new(); + + for item in alts.iter() { + let mut news = self.rule_accepts(item, s)?; + results.append(&mut news); + } + + Ok(results) + } + + Rule::Sequence(seqs) => { + let mut results = vec![s]; + + for item in seqs.iter() { + let mut new_results = vec![]; + + for early_result in results.drain(..) { + let mut nexts = self.rule_accepts(item, early_result)?; + new_results.append(&mut nexts); + } + + results = new_results; + } + + Ok(results) + } + + Rule::Nonterminal(new_rule) => self.accepts(*new_rule, s), + + Rule::Terminal(term) => { + if let Some(rest) = s.strip_prefix(term) { + Ok(vec![rest]) + } else { + Ok(vec![]) + } + } + } + } + + fn rewrite(&self) -> Grammar { + let rule8 = Rule::Alternatives(vec![ + Rule::Nonterminal(42), + Rule::Sequence(vec![Rule::Nonterminal(42), Rule::Nonterminal(8)]), + ]); + + let rule11 = Rule::Alternatives(vec![ + Rule::Sequence(vec![Rule::Nonterminal(42), Rule::Nonterminal(31)]), + Rule::Sequence(vec![ + Rule::Nonterminal(42), + Rule::Nonterminal(11), + Rule::Nonterminal(31), + ]), + ]); + + let mut rules = self.rules.clone(); + rules.insert(8, rule8); + rules.insert(11, rule11); + Grammar { rules } + } +} + +#[derive(Clone)] +enum Rule { + Alternatives(Vec), + Sequence(Vec), + Nonterminal(usize), + Terminal(String), +} + +impl Rule { + fn new(s: &str) -> Result<(usize, Rule), GrammarParseError> { + let mut parts = s.split(": "); + let rule_num_str = parts + .next() + .ok_or_else(|| GrammarParseError::BadRule(s.to_string()))?; + let rule_num = usize::from_str(rule_num_str)?; + let definitions = parts + .next() + .ok_or_else(|| GrammarParseError::BadRule(s.to_string()))?; + let mut alternatives = Vec::new(); + + for alternate in definitions.split(" | ") { + let trimmed_alternate = alternate.trim(); + let mut sequence_members = Vec::new(); + + for member in trimmed_alternate.split_ascii_whitespace() { + let item = if member.starts_with('"') && member.ends_with('"') { + Rule::Terminal( + member + .strip_prefix('"') + .unwrap() + .strip_suffix('"') + .unwrap() + .to_string(), + ) + } else { + Rule::Nonterminal(usize::from_str(member)?) + }; + sequence_members.push(item); + } + + match sequence_members.len() { + 0 => return Err(GrammarParseError::BadRule(s.to_string())), + 1 => alternatives.push(sequence_members.pop().unwrap()), + _ => alternatives.push(Rule::Sequence(sequence_members)), + } + } + + match alternatives.len() { + 0 => Err(GrammarParseError::BadRule(s.to_string())), + 1 => Ok((rule_num, alternatives.pop().unwrap())), + _ => Ok((rule_num, Rule::Alternatives(alternatives))), + } + } +} + +macro_rules! run_parser { + ($parser: ident, $line: ident, $count: ident) => { + if $parser.parses($line)? { + $count += 1; + "YES" + } else { + "NO" + } + }; +} + +#[test] +fn rewrite_test() { + let line = "aaaaabbaabaaaaababaa"; + let contents = fs::read_to_string("inputs/day19_test2.txt").unwrap(); + let mut grammar = Grammar::new(); + for line in contents.lines() { + if line == "" { + break; + } + + let (num, rule) = Rule::new(line).unwrap(); + grammar.add_rule(num, rule).unwrap(); + } + let rewritten = grammar.rewrite(); + assert_eq!(Ok(false), grammar.parses(line)); + assert_eq!(Ok(true), rewritten.parses(line)); +} + +fn main() -> Result<(), TopLevelError> { + let filename = env::args().nth(1).expect("No file argument given."); + let contents = fs::read_to_string(filename)?; + let mut grammar = Grammar::new(); + let mut lines = contents.lines(); + + for line in &mut lines { + if line == "" { + break; + } + + let (num, rule) = Rule::new(line)?; + grammar.add_rule(num, rule)?; + } + + let mut matched_orig_lines = 0; + let mut matched_rewritten_lines = 0; + let rewritten_grammar = grammar.rewrite(); + + for line in &mut lines { + let orig = run_parser!(grammar, line, matched_orig_lines); + let rewritten = run_parser!(rewritten_grammar, line, matched_rewritten_lines); + println!("{} ==> {} / {}", line, orig, rewritten); + } + + println!("{} lines matched originally.", matched_orig_lines); + println!( + "{} lines matched after it was rewritten.", + matched_rewritten_lines + ); + + Ok(()) +} diff --git a/src/errors.rs b/src/errors.rs index dc27387..97dc3a7 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -54,6 +54,8 @@ pub enum TopLevelError { BitmaskCommandParseError(#[from] BitmaskCommandParseError), #[error("Ticket parsing error: {0}")] TicketParseError(#[from] TicketParseError), + #[error("Bad rule parse: {0}")] + GrammarParseError(#[from] GrammarParseError), } #[derive(Error, Debug)] @@ -194,3 +196,15 @@ pub enum TicketParseError { #[error("Bad field definition: {0}")] BadFieldDefinition(String), } + +#[derive(Error, Debug, PartialEq)] +pub enum GrammarParseError { + #[error("Bad rule reference: {0}")] + ParseIntError(#[from] ParseIntError), + #[error("Reference to unknown rule: {0}")] + UnknownRule(usize), + #[error("Bad rule definition: {0}")] + BadRule(String), + #[error("Duplicate rule definition for {0}")] + DuplicateRule(usize), +}