diff --git a/19input.txt b/19input.txt
new file mode 100644
index 0000000..eebf3a3
--- /dev/null
+++ b/19input.txt
@@ -0,0 +1,530 @@
+70: 90 92 | 53 50
+99: 90 102 | 53 22
+24: 130 90
+125: 85 53 | 100 90
+61: 53 58 | 90 26
+88: 33 53 | 46 90
+32: 65 90 | 90 53
+48: 46 53
+116: 53 50 | 90 18
+40: 53 83 | 90 81
+54: 46 53 | 5 90
+36: 50 90 | 130 53
+58: 92 90 | 130 53
+2: 19 53 | 75 90
+95: 53 46 | 90 19
+124: 46 53 | 33 90
+79: 91 53 | 7 90
+46: 90 90 | 53 90
+87: 9 90 | 84 53
+122: 90 46 | 53 33
+15: 89 90 | 79 53
+41: 90 4 | 53 119
+7: 53 128 | 90 128
+93: 53 120 | 90 37
+121: 15 53 | 103 90
+91: 90 33 | 53 110
+5: 53 90 | 65 53
+26: 53 19 | 90 107
+44: 53 75 | 90 32
+23: 107 53 | 50 90
+33: 90 53 | 90 90
+75: 53 53 | 90 90
+18: 65 65
+59: 53 107 | 90 32
+104: 90 33 | 53 46
+20: 121 90 | 123 53
+100: 90 75 | 53 46
+131: 18 90 | 46 53
+9: 90 67 | 53 105
+37: 53 75 | 90 128
+3: 53 29 | 90 22
+120: 53 92 | 90 33
+35: 55 53 | 30 90
+115: 65 107
+106: 90 46 | 53 19
+89: 90 59 | 53 68
+83: 90 46 | 53 130
+25: 90 87 | 53 41
+11: 42 31
+84: 53 117 | 90 34
+8: 42
+53: "a"
+86: 53 6 | 90 12
+76: 53 78 | 90 97
+52: 126 90 | 115 53
+31: 53 35 | 90 20
+112: 110 90 | 32 53
+82: 101 90 | 127 53
+119: 53 27 | 90 93
+117: 90 81 | 53 23
+57: 82 53 | 43 90
+105: 90 126 | 53 21
+111: 53 32 | 90 110
+68: 53 18 | 90 46
+73: 71 90 | 24 53
+49: 77 90 | 48 53
+81: 90 50 | 53 75
+102: 32 53 | 128 90
+12: 92 53 | 19 90
+60: 62 90 | 108 53
+101: 53 104 | 90 62
+65: 53 | 90
+50: 53 90
+97: 53 56 | 90 64
+63: 99 90 | 39 53
+43: 90 125 | 53 60
+66: 130 90 | 33 53
+27: 53 2 | 90 14
+4: 3 90 | 74 53
+118: 53 76 | 90 57
+113: 86 53 | 13 90
+56: 90 28 | 53 54
+38: 36 90 | 69 53
+39: 10 53 | 23 90
+14: 90 50 | 53 18
+45: 53 72 | 90 40
+21: 130 90 | 107 53
+30: 90 113 | 53 1
+19: 53 53 | 90 53
+130: 53 53
+110: 53 65 | 90 90
+0: 8 11
+77: 53 110 | 90 92
+62: 53 33 | 90 19
+126: 50 90
+29: 75 53 | 5 90
+129: 98 53 | 47 90
+47: 53 94 | 90 95
+71: 107 53
+92: 53 53 | 90 65
+127: 22 53 | 109 90
+6: 92 53 | 32 90
+51: 26 90 | 66 53
+107: 90 53 | 53 90
+72: 90 124 | 53 104
+1: 53 96 | 90 52
+103: 53 73 | 90 61
+74: 2 90 | 131 53
+64: 90 7 | 53 122
+67: 53 70 | 90 104
+42: 53 25 | 90 118
+123: 63 90 | 80 53
+17: 46 53 | 130 90
+10: 19 90 | 33 53
+13: 53 112 | 90 17
+28: 90 128 | 53 110
+114: 53 5 | 90 50
+78: 49 90 | 51 53
+16: 111 53 | 14 90
+90: "b"
+85: 130 90 | 50 53
+80: 38 53 | 16 90
+69: 110 53 | 107 90
+98: 53 44 | 90 88
+94: 5 53 | 46 90
+108: 18 53 | 75 90
+55: 90 129 | 53 45
+128: 90 90
+34: 106 90 | 114 53
+109: 90 110 | 53 50
+96: 36 90 | 116 53
+22: 75 53 | 18 90
+
+aaaaaaaabbbbaabaabbbaaba
+aaaaaaaaabbaaabbbaabaaaaabbaaabaaabbbbbb
+babaabaaabaaabbbaaaabbba
+baaaabbbabbabbbbabaababa
+aaaaabaabbbabbbabaaabababaabaabbbaaaabba
+babababbbaababbabaaaaaab
+bbabbbabbabaaabaaaaaaaba
+bbaabbaaaababbabbbabbbbb
+babbbbbbbbbababaaaabbbab
+abbbbbbaaaabbaaaaabbaaababbbbbababbaaaab
+aabbaabaaabaabaababbbaaa
+baaabaabaaabaabbbbaaaaba
+aabababbaabaaaabbaaaabaaabbbbbaa
+bbbbbababbaabaaabaababbababbaabababbababbaabbabaaaabbbba
+bbbaabbbaababbaaaaaaaabb
+aaababbbbbaaababababaabb
+bbabaabbababbbaabbababaa
+baaabababbbbbaaababbabab
+aaaababaaabbaababbaaaabb
+ababbabaaabaaaabbbbaaaba
+bbaaababbbbababbabbaabba
+babbbbbbbbbababababbaaab
+babaabbbbababaababbaabaabbabaabb
+baaaaabaaaaaabaabbaaabaa
+aabbabaaabaaabababbbbaab
+bababaabaabbaabbababaaab
+babaababbbbbbabababbbaaa
+babaaabbaababaaaaaaabbbb
+bbbbbabbbbaabaaabbaabbaabaabbaabaababbaa
+bbababaaaaaaaababbbaabbabbbaabbabbabbaabaaaaaaaaabbbabbbbaabbaababaaaaabaabbaaaa
+abaaabababaaabaabbbaaaaa
+baabbbbbabbbabbbbbaababbaababaaabbbbaaaa
+abbbabbbabbbaabbbaaaabab
+babbabbbabbbbabbaaabbaaabbababbabbbbbbaababaabbb
+babaabaaabbaabaaaaabbbbbabaabaaaabbbbaaaaaaababbabbaabbbaaabaaaababaaaba
+aabbababbaaaaaaabbbbababbaabbbbaaababbbbaaaabbabbabbbbaaaabbababbbbbabba
+bbaaabbaabaabaaabbaaaabb
+bbaabaaaabbabbababbbbbabbaaaaaababbaabbb
+baaababaabbbabaabbaaaaabaaababab
+abababbabbaabaabbaaabbaa
+bbbbabbaababaaaabbbbaaaababbabbbabbbbbabbbaaabbabbbbbbbabbbaabababaabbbb
+bbabaaaaaaababbababbabaaaaaaabaabbbbbaaabababbaaaaaaaabbbbabaabaaaaaabbbbababaabaabbaababbaaabab
+babaaaabbaaabababbaaabbbbaaaaaaa
+babbbabbbaabbababbbaaabb
+abbbabaaabbabbbbbbabababaaaaabba
+baaaaaaaaababaaaabbbbbaabbaaaaba
+bbbabbbababbaababaabbabaaabbbabbabaaaababbbaaaab
+bbbaabaaabbaaaaabbabaaaa
+abababbabaababbaaabaabaaaaababbbbaaabbaabbbababbababaaba
+bbbaabbbbbbbbbaababbaabababbaabaabbbbaba
+babbaaaaaabaaabaabaabaabbbaaaababaaaaabaabbbaaaabbbabaabbabbbaabbbabaaab
+bbabbbbaababaabbababbbbaaaaabaabbaababbbabaabaaaaababaaabbabbbba
+abbabaaaaabbbbbabbaaabbb
+aababaaaaaaabaaabbababbb
+babbbbbbbbbababaaaabaaab
+bbbabaabababaaaabaaaabba
+aaababbbbabbaabbbabbbabbbbababaa
+abbbbaaaabaaaabaabaaaaba
+bbabaabbbaabbabbaaaababbbbbaabbaabaaaaaabbabbbbaababaaba
+abaaababaaaaaaabbbabbbbaabbababbbbbaababbbbbabbaabbbbbababbabbbb
+bababaababbaaaaaaabbabab
+baaabbaabbaabaaababbababbbabbbabbbbbbaab
+baaaaababaababbaaaababab
+abbaabaabbbabbaaaaabaaab
+abbbabbaabbaaaaabbbbaaaabaababbabaabbbaa
+bbaabbbbbaabbaaaabaabaaaababbaaa
+aaabaaaaabbabbabaaababaa
+aabaabbaaabbbbbaabbbbbbaabaabbba
+aababbaababbbabbabbbabab
+bbabbaaaaabbbbbaaabababa
+aaabbbbbabbbbbaababaabba
+aaaaaaaabbabaaabbbabbbaa
+bbbabaaaaaabaaaaaaababaa
+aabbbabbbabbabababbbabbbbbbbabba
+baababbababbaabaabbbbaba
+abbbaabbbabbbabbabbabbaa
+aabbaabbabbbbbbabaabbabbabbbbbbbaaabbbbbaaaabbba
+bababaabaabaaabaaaabbbaa
+bbbabaabbaaababababbbbba
+abbbaabbbbbaaaabbabbbbabababbabb
+baabaaaabbababbbabbaabbabaaaabab
+babaabbabbaabbbabbaabbababbbbabb
+aaaaabbbaaabbbbbabbabbbbbbbabaabbbabbbababaaaaaa
+babaaaabbababbaaababaababaaaabba
+bababaabbbbabababbabaaba
+aaabbbbbaabababbababbabb
+bbbaabbbbabbbbbbaabaabab
+baababbabbbbbabaabaabbbb
+abbbabaabbbbaabaababbbaa
+aababaaaaabaaabaaaaaaaba
+abbbbaaaababaaabbaaaaaaababbaaaababbbaabbaabbbbbaabbababbaaabbbb
+bbbbbbaabbbababaabaaaababbbbbaabaabbaaaabbbbaaababababaa
+bbbaabbaaaabaaababbabbaaaabbabbabaabbbaaaabaaaaa
+bbbabbbabbbbbaababaaabbbaaababbaabaabaaa
+abbbabbaabbaaaaaaabababa
+baabaabbabaaabbabbbaaabb
+aaabaabaabaaabaaababbbaa
+babbaabaabaaaabbabbbbaba
+bbbbaabbbaabbaabbbabbbbaabaaababaaaaabab
+baabaabbaaaaabaaaabbabaabbbbbabaaababbabbbbbababbabaabbbbbabaaba
+abaaabbaaabaabbaaaaabbba
+ababaaaabbaaaaaaabbbaabbabbbbabb
+babaabbababbbabbabaabaabbbbbaabbbabaaabbaaabbbba
+baabbbbbbbbabbbbbababbab
+ababbababaaaaabbbbbabbbbabaaaabbaaaaabaaabaababb
+aaabaabababaabababbababb
+aaabbbbaaaaabbbbbbabbabbbabaabaabbaaaaaabaaaaabbbbbabbbabaaaaabaababaaba
+bbaabbaaaaaababbbaababaa
+aaaaabbbbbaaaaabbaababaa
+aaabbbbbabbbbbababbbaabbaaabbabbabaaabbb
+baaaaabbbbbbbbbabbbbbabbbaabbbababbbbbaa
+abbabababbbbabbabbaabbaabaaaabaabbbbbaaabbbbbbaaabbabbbabbbaaabbbbaaabab
+bbabbbabbbbabaaaabbabbabbaaabbab
+aabbaaabaabbbabbbbbaaaba
+ababbabaabbbaabbaaaaabbbaabaabbbbbbbbbbbbaaabbbbbaabaaabbaaaabba
+bbabbbababababaabbaaabbb
+babbabbbbbbabbbabbabaabbabbaaabbababbababbabbbbbabababaa
+bbaaaaabaabaabaabbbabbbbaabbbbbbaaaaaaba
+aaaaababbaaaaababaaabaaaaaaaaaabababbabbabbaaaaa
+abaaabbbaaabaabaaabaaaabaaabbbaa
+baaaaababbabbbbaaaaaaaaabbbbabba
+bbaabbaabbbbbabaaabbbbbabaaabaaaaaabbaba
+bbaaabbabaaaaabbaabbaababaaaabaaababbbab
+aabbaaababbbbbbbaabbabba
+abbabbabbbaaabbababaaaaa
+abbaabaabbbbbbbbbbbabbbbbabaabaa
+aabbabaaababbabaabbbaaaa
+bbabaababbabbaaaaaabbbbbabbaabaabaaabbbbbabbaabbbaaaaababbaababbbbababab
+bbabbaabbbabbbbabaaabbaa
+aaaabbababbaaabbabbbabaabbbaaababababbab
+aaaababbaaabaabbbaabaaab
+aabbaabbaaabaaaabbaabbab
+babababbaabbbbabbbabbaabbaaaaababaabbabbabbabbbaabababaabbabbbaa
+baabbaabbababbbbabaaaaba
+aabaaabbababbbaaabbbabaabaaaabbbabaabbaaabbbaabaaaabaaaaabaaabbabbbabbbb
+aabbbbbbaabaaabaaabbbbabaaabaabaababbaababbaabab
+bbbabbbaaaaabaabbbbbbaaaaabbbbbabbabaaabbbbaabba
+aabbbaaaabaaaabbbbbabbab
+bbaaaaaaabbbbbbbababbbaa
+baaaabbbabbbbbbbbbaababa
+abbabaaaaabbbbbaaabbaaaa
+bbbbbbbbaabaabbbbaaaabba
+aabaaaaaaabbbaababbaabbbbababbabababaaab
+aaaabbabaabbabaaaaabbbab
+baaabbbbbbbabaabbbaabaabaaaaababbaabbbbababbbbababbbbababbbbbbab
+baabbbbbbababbbbabaaaaaa
+bbbbbbbbbaaaaababbabbbbbbbbaaabb
+abbaaabbaaaabbabbaabbabbbbaababbbbbbbabb
+abbabababbaabaaaabbbaaba
+abbabaaaaabbbbbbaaaabbbb
+bbaabaababababbabbabaaaa
+ababbbbbbabbabbababbaababbbabbabbbabbabaaaaaababaaaabaabbbaababa
+bbabbabbabbababaaaababaa
+baabbaaabaabaaaaabaaaaab
+bbbabbaabbaaababbaaaaaab
+bbbbaabaababbabababbaaaa
+babbbabbabbabbabbbaaabbaaabbaabababbbabb
+aaaababbbaaaaababbbbbbaaabaababb
+bbbbaaaabbbbaaaaaabaaababbaabaababababaa
+baabbbabaaababababbbabab
+aaaaaaabbbbbbabaababbabb
+aaaaaababbbaaaaabababbab
+baaabbbbaaaabababababbba
+ababbbabaaaabbabaaaaabababaabbba
+abbabbbbbabbaabaabaababb
+baaaaababbbaabababbaabab
+babbaaaaaabbbbaabbabbbabbbbbbababaabbabbababaaba
+bbbbbaaaaabababbaabaabbaabbbaabbabaabbba
+bbbbaabaaaabbbbbbabbaaab
+baaababaaababbaaaabbbbbbabaaaaaa
+aaabbaaaababaabbabbbbabbbbaaaaaaaaabbaaabaabbaabbbbabbabbabbaaabaaabaabb
+aabaabbabbbabbbaabaaaaab
+abaabaaaaabaabaaabaabbba
+aabbbbabaaababbbababbbaa
+bbabaaababbabbabaabbaabbbbbbabba
+aabbbaaaaabbbbbbbababaaabaabbbaa
+abbbbabbaabbabaabaababaaabbabaaabaabaabbaaaaabaabbaaabbabbaaaaab
+bbbabaaabbaabbbbaaaaaaba
+baaaaabbaaaaabaabbababbb
+bbbabbbbbabbbbbbbbbbabab
+abbbabaabbaaababbbbbabaa
+aaaaabaaaaababbbabaaaabbabaaaaba
+abbababbbbbaaabbaaaabbbabaaabbbaaaaabbaababaaaababaaaabb
+abaabbbbbbbabaabababbabbbbabaaabbabababbaaabbaabbaababab
+baabbababbbabbaaaaaaaaba
+aabbbabbaaaabaaaababaaab
+abbabaaaaabbbbabbabbbbaaabbbbbabbbaaaabbbbaababb
+abbbbbbaaaabaababbaabbaa
+bbbbaabaabaaababaaabbabbaabbbabbbbababbbaabbabbabaabaaba
+abbbabaaaababaaaababaaab
+bbabaaababbaabbababbabaabaababaa
+aaaabbbaaaaabbbbabbbbbbabbbabaabbbabbbaabbaabababababaaabbbaabbabbabaaaabbbbbbbbabaaabba
+abbaabaabbbabbbbabaaaaab
+abbaaaaababbbbbbbabbabbaabbababbaaaaaabbabbaaaabaabbbaba
+aababaaaaabaaabbbaabaaab
+bbbabababbbabbbbabbabaaababaaaaa
+abbbbaaababbaaabbaaaabbabaabaaab
+abaabaabbbbabaabaabababa
+aaaaaaaaabaaababbbabbabbaaaaaaabaaaabbababababaa
+abababbbabababbaaabbabbbbbaabbbbbbaaababbbabbbbaabbabbaa
+bbbbbabaaabbbbabaaabbabbabababbaaaaabbbb
+aabbbbaaaaababbbaabbabba
+baaaaababaaaaababbabbbbaaaaaabaaababbaaabaaaaaaa
+abaaaabbabbaaababbabbbbb
+bbaabaaabaaaaabbbabbaabaaaabaabbaaaaabba
+abbbbbbbbabbbbaabbabaaaaabbabbbabaaabaaa
+bbbaabaaabaaaababbbbbabbbbbbbabbbbaaaaba
+abbaaabbbaabaabbbbbbaaab
+aaabbaaabbabbaabbababbaa
+abbbabbbabababbababaaaaa
+bbabbbbabaaaaababbaababbbbbaabaabbabbaaaaaaaabbbaaabbaab
+abaaababbbaabaaababbabaa
+bbaabaabbaaabbbbbaaaaabbaabbbbbbabbabaaabbaabababababbbabaaaabab
+abbaaaaaaabbabaababbbbba
+bbbababababaaabbabaaaaaa
+babbbabbbbbabaabababbabb
+abbaaaaaabbabaaabbbbaabbbabababa
+abbabbbbbbabaabbbabbabba
+baabaaaaaaaabaabbbbababaaaabbaaabbbaaabbbabbbaba
+baaabaababbaaabbabbbbabb
+abaabaabbbbbaabbababbbaa
+bbbbaabaabbababbbbababaabaaabbabbbbbabbabbbabbab
+bbabaaababbabaaaaaabaabbaabaaabaaabbaababbaaabbbbbbbabba
+bbbabaaaabbabbabbbbabbab
+bababaaababbbbbbbaabbbaa
+abbbbbbbbbabbaaabbababbb
+aabbaaabaabbbaaabbbaaaba
+aabbabbbbabaabababbabbaa
+abbbabaababaaabbabaabaaaaabbbbababaaabaababbaaaa
+aaaaabaabaaababaabaaaaab
+bbbaabbbbbaabbaababaabbb
+abaaaabbabbabbbbbbbbaaab
+aabababbbaaabababbabbabbaaaaabab
+bbabbaaaaaaaaaabbaaababb
+baaaaabaaaabaaaabbbabbbbaabbbbaaabaabbabbabbbbbababaaaaa
+aaababbaaababaaaaaabaababbbabaaa
+babbaabbbaaabaababaabbba
+abbbabaaabbababaaababbbb
+abbbaabbbabbababaabbaaabbabbaaaa
+bbbaabababbaaabaaaababab
+aaaaaaaaabbabbabababaabbbbaaaabbbbababbaaaabbaaaabababaabaabababbbbaaabaaaabaabb
+bbbbbaaabababbabaabbbbaabaaaaabbabbbabbabaabbbbaaabaababbbaabbba
+aaabbabbaabbaaabbbaaabbaaabbbbbabaaaaabaaababaaabaabaaab
+bbaababbaabbbbbbaabbbaaaabaabbab
+bbbbababababaaaaabbbaabbaaababbbababbabaaabbbaaa
+bababaaaaabaaabbbbabbababbbbbaaa
+babababbaaaaaaababaababb
+bbaaaaaaaabababbabbaabab
+abbaaaaabbbbbbaaaababaab
+babaababaababbaabbbabbbbbabbabbb
+aabbbbbbaababaaaababaabb
+aaaababbabababbabbabbabbbbaaababbabbbaab
+bbabbaaaaabaaababaabbaabaaaaabab
+aaaaaaaabbbbbaaaabbaabab
+abaaaabbbabbbabbabaabaabbbaaaaabbbbaabbb
+babaaabbabababbabbaaaaba
+baaababaabbabaabbaababbb
+aababaaaabaaabbaabaababa
+bbbabaabbabbbabbbbaaabbb
+abaaabbabbaabbaabaaabbaa
+bbbababbbbbbbaaabababbbaabbbaabbbaabaaabbabbabbabbaabaaaababbbbbbbbbbababbbabbaa
+bbbbaaaaaabbbabbabbaabaababbababaabbabaaaaababbbbaababaa
+bababbbbbaabbaababababbbabbbaaab
+bbaababbabbbaabbbababbab
+baabaabbaabbaabbbaaaabab
+aaaaabbbbababaabaabaaaaa
+bbbabaababbabaaabbbbabab
+bbbabaabaaaaaaaabaabbbababbaaabaaaabbabbaaaaabbbabbaaabb
+aabbabaabbbbaabaaababaaaabbbabbbbbbaaaaababbbbab
+aaaaaaabbabaaabbababaabb
+abaaabaabbabbaaabbbbbaab
+aabaabbaabbabaaabbabbabbabbbbbbbaaaabbbb
+baabaaaabbbabaabaabbaabbaababbaaaabbaaaaaababaab
+baabbaaaaabbbbbbabbabbba
+aabbbbbbbbaababbaaabaabaabbbabaababbbabaabbababb
+bbabaabbbabbaababbababba
+bbbbaabbbbaabbaaabbbbaba
+aaababbabaabbabbabaaaaab
+aaabaabaaaaaabaaabababab
+ababbabaabbbbbabbabbaababababbba
+abbaaabbbbbabaabaabbbbbababaababaabaabaabbaabbbaabbbbaaa
+baabbaabbbaaabbaabaaaabbbbbbbbaaabaaababababbbba
+aaaababaaaaabbabaabbaaaababaabaabaabababababbbbaaabbaaaa
+aaabaabbbbbaabaaababaaba
+bababaabaabbbabbaaaabbababbabbaa
+baabaaaaaabbaababaaababb
+baaaabaaaaaaaaaabbabbbaa
+babbaabbabaaabaaabbaabaabababbbabaababababaaaaaaabaaaaabaaabbbba
+abbaaaaabaabbbbbabaaaaaabbbbbbba
+aaabbaaaabaaaabbbaababab
+baaabbbbaabbbabbaabbbaab
+babbaabbbabbabaaababbbababaababbbabbbbbbbbaabaaaabaaabbbbaabbbbbbaaabbbb
+bbabbabaaaaaaaabaaaaaabb
+ababbbbbababbabaaabbaababababbbbabbbbaaaaaaaaaaaabbbbbbabbbaabba
+aaababbaaabababbababaaba
+aaaaababbababbabbaaabbbbbbaaaabaaaabbabb
+baabbbbbabbbabbbaaabaaab
+babaaababaababbbababbbbabbababababbbbaab
+abaabaabbabababbbaababbbbabbbbab
+baababbababaaaaaaababaababbaabaaaabaaabaabbbbbbabbbbabaabbbababbaaaabbbabaaaaababbbababaabaaabab
+bbbbbbaaabbababaabbbbaab
+abbaaaaabbabbabaababbaaa
+baaabbbbaabaabbbbbbabbbbbaaaabab
+bbbbbbaaaabaabaabaaabbaa
+aabaabbabbbabbbaabaaabbb
+bbaababbaabbbbabbbababbb
+bababaaabbabbbabaaaaabbbaaabbaab
+babbabbbbbabaabbbbabbbbaaabbbaaabaabbbbaaabbaaaabbbbabbb
+babbababbbabbabaabbbbaab
+aaaabbabbbabbbbabbbbaabaabbabababaaabaabbbbbbbbabaaaabba
+bbbbaaabaaabaaaaabbaabababaaabbbabbabbbb
+bbbabababbbbbbaaabbbbbaa
+baababbabaabbabbaabaabbbaabbbbbabbabbbaa
+bbaabbbbbbabbababaaabbaa
+aaaaaababaabbbbbbaabbabbbababaaaaababababaaabbabaaaabbbbaaaabbabbabbbaab
+babbbabbbaaabbbbbbaaaaaaaaabaabbbaabbaaaaababaabababaaba
+abababbbaaaababbbbaaabaa
+ababbabaaaaababbabaaaaaa
+bababaaaabbaaabbbababbab
+bbaabbbaabbabbbbaabababa
+baabbbbbabbabbabbbbbaaab
+abbaaaaaaaaabaaabaaaabba
+aabbaabbbbbabbaababbababaaabaabb
+bbaababbbbbabbbaaaababbabbaababbabababbabbababaabbaaabaaabaabbaa
+abbbbbabaaabbabbababbaab
+aaaaabaaaabaaaababbbbaaa
+aabaaabbbabbabbbabababaa
+aabbbabbaaaaabbbaababaab
+abababbbbbaabbaaabbbaabbaaaaabaabaaaabaabbbaaababbaababaabaababaababbbbb
+babbaabaabababbbaaabbaab
+abbbaabbabbbbbbbbaaababababbbaabbababbab
+aaaababbabbaaaaabaabaabbbbabbbaaaaaaabba
+bababbbbbbbbaabbaaaabbba
+bbaabbbaaaaaabbbbabbbbaa
+aabbaabaabbbabaabababbbbbbbbabab
+babababbabbbabaabbbabaaaabababaa
+babaaababbaaaabbbaabbbba
+ababaaaaabbbbbbbbaabbabbbabbaabbaaaabababaababaa
+bbaaaaabbaaaabbbbabbaabaababaababaabbaabababbbbaabbabbaa
+baabbabbaaabaabbbbbbaabaaaaabaabaabaabab
+aaababbbbbaababbabbabbaa
+aabbaaabaabbaaabbaababab
+abbabaaaaababaaaaaaaaaaabaaabaaabbbbabaa
+aaabaabaabbbabaabaabbabbaababaaaabaababa
+abbabbabbababbbbbaaaaaab
+aabaaabbbbbaaaabbbabababbaaaabbbaaabbbab
+bababbaaababbabababbabaabababaababbabaaaaaabaaaabbaaaaaabaabaaab
+aababaaabaaaaabbabababaa
+aabbabaabbabbaaabbbaaaba
+aabbabbbabbabaababbaaaaaaabbbabbaaabbaabaaaabbbbaaaabbba
+abababbabbbbaaaababbbbab
+aaaabbbbbbbbaabbbaababbaaabbbbbaaababbabbbbaaaaaababaabbababbbaabaababba
+abaaabbababababbbabababa
+abaaabbaabababbbbaaaaaaabbbbabbb
+aabababbbbbabaaababbabbbababaabb
+abababbaabbbaabbaabbbbbabbbbbbbb
+aabaabbbbbaabbbabaaabbbbbbaaaaaabbbbbbbabababbaabaaaabaa
+babaaaabaaababbaaabababa
+bbaabbbaababbababbbaaaab
+bbbaaaababbbbbaabbbbbababbababbaabbaabababbabbbababbbbababbbabaaaabbabaaabaaaababbbbbaaaabaaabbb
+baabaabbbaabbabaaababbba
+bbbaabbbbbababbbbbbbaababbaabbaabbbbbaababbaabbabbbbaaabaabaabbabaabbbaa
+bbbbbbbababbbbbbaabaababaaaaabbbbbbabbbb
+aababbaabbbbaabbbbbaabbbaabaabaaaaaaabbbbabababa
+abbbabaaabaaabbabbaaaaba
+aaaaabbbaabbbbbbaaababbbbabaabbaababaabbbabaaaaabbaaabbb
+babbabbbbbabaaabaaaabbaa
+bbbbaabbaaaaabaabbabbaaabbabaaaa
+aaababbbaabaaabbbbbaabba
+aabbaabbababaaaaabbababbbababbaaabbbbaabbbbaaabbbaaabaab
+bbabbabaabbabaabababaaab
+bbaaababbbbbaabababbbbaa
+aaaababaabbaaabbabbbbbaa
+bbaabbbaabaabaabbbaaaaababbabaabbbabbabaaabbabbabbbbabaa
+babbababaabaaabababbababbbaaababbbabbbbbbabababa
+aababbaaaaabaabbbbaaabaaabbbbabb
+bbbaaabbabaabbbbaabbabbbbabbaabbbabaababbbbaaaaaaababaabaaaaaaabbababaaa
+abbaaabbbbabbaaaabaabbba
+aaaaabaaaaaabbabbbaabaaaabaaaaaa
+aaabbbbbbaabaabbabbbaaab
+abaabaabbabaabbabbababbb
+aabbbaaaabababbababbbabbbabbabababbbbaabbaaaaaaa
+baababaababbabbbbbbabbbbababbabaabaaaaba
+bbaabbaabbaaaaaaaaabbaba
+aaaaabbbbaabbababababbbbbaababbaaaabbaab
+abbaabbabaaabbbaaaaaaabbaababbbaaabbbbbbabaaaaabbaabaaaabaaaaaababaabaababbbbbbbbaabbabb
+baababbabbabbabaabbabaaababbbaaa
+baabbaabaababbabbbbbabbb
+aabbaaababbbabbbbaabbaabababbbbb
+aabbbabbaaabaabaabbbaaab
+abbbbbbbbabababbbbaaaaabaabaabbbbababbaa
+bbbbbaaabbabaaabaababbababbababababaabbbbabaaaaa
+abbabbabaabbbbbbaabbbbbbbabbabbbabbaaaaaabbbaabababbaaaa
+aaaababbaababbabaaaaabaaabbbbbbbbbbbbaba
+bbbbabbaabaaabbabbaaabbaaababbaabbabbabaababaababbaaabaa
+aaabbbbbbaabaabbbbaababa
+baabaaaaaaabbabbbabbbabbbabbaaabbaaaabab
\ No newline at end of file
diff --git a/2020.csproj b/2020.csproj
index ddb8a35..6c4dde6 100644
--- a/2020.csproj
+++ b/2020.csproj
@@ -59,6 +59,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Program.cs b/Program.cs
index 315b98f..792f532 100644
--- a/Program.cs
+++ b/Program.cs
@@ -21,6 +21,7 @@
Q14.Go();
Q15.Go();
Q18.Go();
+ Q19.Go();
Util.Log($"Total time={(System.DateTime.Now - start).TotalMilliseconds}ms");
}
}
diff --git a/Q19.cs b/Q19.cs
new file mode 100644
index 0000000..28b8d49
--- /dev/null
+++ b/Q19.cs
@@ -0,0 +1,218 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+
+namespace _2020
+{
+ class Q19
+ {
+ static Dictionary rules = new Dictionary();
+ static List messages = new List();
+
+ [DebuggerDisplay("ch={ch} | num rules={ruleIdxs?.Count}")]
+ class Rule
+ {
+ public char? ch;
+ public List> ruleIdxs = new List>();
+ }
+
+ public static void Go()
+ {
+ var start = DateTime.Now;
+ MakeList();
+ Util.Log($"Q19 MakeList took {(DateTime.Now - start).TotalMilliseconds}ms");
+ var p1start = DateTime.Now;
+ Part1();
+ Util.Log($"Q19 part1 took {(DateTime.Now - p1start).TotalMilliseconds}ms");
+ var p2start = DateTime.Now;
+ Part2();
+ Util.Log($"Q19 part2 took {(DateTime.Now - p2start).TotalMilliseconds}ms");
+
+ Util.Log($"Q19 took {(DateTime.Now - start).TotalMilliseconds}ms");
+ }
+
+ static void MakeList()
+ {
+ int mode = 0;
+ foreach (var line in File.ReadAllLines("19input.txt"))
+ {
+ if (mode == 0)
+ {
+ if (string.IsNullOrWhiteSpace(line))
+ {
+ mode++;
+ continue;
+ }
+
+ var chunks = line.Split(":");
+ var ruleIdx = Convert.ToInt32(chunks[0]);
+
+ if (chunks[1].StartsWith(" \""))
+ {
+ rules.Add(ruleIdx, new Rule() { ch = chunks[1][2] });
+ }
+ else
+ {
+ var refs = chunks[1].Split("|");
+ var ruleIdxs = new List>();
+ foreach (var ruleRef in refs)
+ {
+ var refGroup = new List();
+
+ var refIdxs = ruleRef.Split(" ");
+ foreach (var refIdx in refIdxs)
+ {
+ if (!string.IsNullOrWhiteSpace(refIdx))
+ {
+ refGroup.Add(Convert.ToInt32(refIdx));
+ }
+ }
+
+ if (refGroup.Count > 0)
+ {
+ ruleIdxs.Add(refGroup);
+ }
+ }
+
+ rules.Add(ruleIdx, new Rule() { ruleIdxs = ruleIdxs });
+ }
+ }
+ else
+ {
+ messages.Add(line);
+ }
+ }
+ }
+
+ static Tuple PassesRule(Dictionary ruleList, int ruleNum, string str, int startIdx = 0)
+ {
+ if (ruleList[ruleNum].ch.HasValue)
+ {
+ return new Tuple(str.Length > startIdx && ruleList[ruleNum].ch == str[startIdx], 1);
+ }
+ else
+ {
+ var matchedGroups = false;
+ var matchLen = 0;
+ foreach (var grp in ruleList[ruleNum].ruleIdxs)
+ {
+ var matchedGroup = true;
+ matchLen = 0;
+ for (int i = 0; i < grp.Count; i++)
+ {
+ var matchedRule = PassesRule(ruleList, grp[i], str, startIdx + matchLen);
+ if (!matchedRule.Item1)
+ {
+ matchedGroup = false;
+ break;
+ }
+ else
+ {
+ matchLen += matchedRule.Item2;
+ }
+ }
+
+ if (matchedGroup)
+ {
+ matchedGroups = true;
+ break;
+ }
+ }
+
+ return new Tuple(matchedGroups, matchLen);
+ }
+ }
+
+ static void Part1()
+ {
+ int numMatched = 0;
+ foreach (var msg in messages)
+ {
+ var result = PassesRule(rules, 0, msg);
+ if (result.Item1 && result.Item2 == msg.Length)
+ {
+ numMatched++;
+ }
+ }
+
+ Util.Log($"Q19Part1: total={messages.Count}, numMatched={numMatched}");
+ }
+
+ static void Part2()
+ {
+ var rulesUpdated = new Dictionary(rules);
+ rulesUpdated[8] = new Rule()
+ {
+ ruleIdxs = new List>()
+ {
+ new List()
+ {
+ 42,
+ },
+ new List()
+ {
+ 42,
+ 8,
+ },
+ },
+ };
+ rulesUpdated[11] = new Rule()
+ {
+ ruleIdxs = new List>()
+ {
+ new List()
+ {
+ 42,
+ 31,
+ },
+ new List()
+ {
+ 42,
+ 11,
+ 31,
+ },
+ },
+ };
+
+ int numMatched = 0;
+ foreach (var msg in messages)
+ {
+ var firstRuleMatches = new List>();
+ Tuple match = null;
+ var startIdx = 0;
+ while ((match = PassesRule(rulesUpdated, rulesUpdated[0].ruleIdxs[0][0], msg, startIdx)).Item1)
+ {
+ firstRuleMatches.Add(new Tuple(match.Item1, match.Item2 + startIdx));
+ startIdx += match.Item2;
+ }
+ var matchCombos = 0;
+ foreach (var firstRuleMatch in firstRuleMatches)
+ {
+ startIdx = 0;
+ while ((match = PassesRule(rulesUpdated, rulesUpdated[0].ruleIdxs[0][1], msg, firstRuleMatch.Item2 + startIdx)).Item1)
+ {
+ if (firstRuleMatch.Item2 + match.Item2 == msg.Length)
+ {
+ matchCombos++;
+ break;
+ }
+ startIdx += match.Item2;
+ }
+
+ if (matchCombos > 0)
+ {
+ break;
+ }
+ }
+
+ if (matchCombos > 0)
+ {
+ numMatched++;
+ }
+ }
+
+ Util.Log($"Q19Part2: total={messages.Count}, numMatched={numMatched}");
+ }
+ }
+}