Day 20 part 1 solution.

This commit is contained in:
Bill Thiede 2020-12-20 10:12:02 -08:00
parent 7bfe984659
commit e8007abb76
4 changed files with 2694 additions and 0 deletions

561
2020/input/2020/day19.txt Normal file
View File

@ -0,0 +1,561 @@
102: 100 47 | 76 84
23: 60 47 | 73 84
132: 17 47 | 81 84
108: 55 100
18: 116 47 | 26 84
103: 84 115 | 47 81
65: 84 113 | 47 50
128: 107 47 | 125 84
14: 84 100 | 47 107
118: 47 17 | 84 57
2: 47 100 | 84 40
28: 63 84 | 74 47
22: 102 84 | 123 47
123: 84 74
19: 3 47 | 13 84
24: 74 47 | 81 84
115: 55 55
90: 92 47 | 44 84
48: 84 94 | 47 96
109: 17 84 | 100 47
92: 84 75 | 47 108
66: 38 47 | 125 84
83: 66 47 | 108 84
31: 121 84 | 77 47
29: 47 61 | 84 111
45: 47 47 | 47 84
59: 47 49 | 84 43
37: 47 30 | 84 95
36: 107 84 | 125 47
82: 74 84 | 38 47
61: 84 10 | 47 110
79: 47 28 | 84 109
33: 101 47 | 133 84
12: 45 47 | 63 84
91: 122 84 | 93 47
122: 65 47 | 52 84
21: 57 84 | 115 47
8: 42
67: 102 47 | 64 84
39: 113 84 | 81 47
41: 84 124 | 47 10
50: 47 47 | 84 84
17: 47 84 | 84 84
120: 98 84 | 78 47
113: 55 47 | 47 84
20: 84 128 | 47 104
7: 84 1 | 47 20
51: 84 113 | 47 81
56: 84 83 | 47 69
131: 84 127 | 47 97
0: 8 11
5: 47 63 | 84 125
94: 15 84 | 127 47
121: 99 47 | 27 84
119: 47 115 | 84 57
129: 47 80 | 84 131
15: 47 100 | 84 45
35: 84 50 | 47 76
95: 47 115 | 84 107
68: 127 84 | 51 47
124: 84 107
75: 50 55
57: 47 84 | 84 55
13: 47 33 | 84 129
53: 106 47 | 59 84
106: 16 84 | 118 47
89: 84 125 | 47 45
104: 45 84 | 76 47
99: 47 56 | 84 7
78: 84 74 | 47 81
64: 17 47 | 115 84
32: 50 84 | 40 47
1: 47 24 | 84 72
47: "a"
80: 114 47 | 109 84
88: 47 119 | 84 132
105: 47 125 | 84 100
6: 68 84 | 67 47
110: 76 84 | 63 47
38: 84 84 | 84 47
49: 47 63 | 84 76
26: 55 107
81: 47 84
74: 84 47
96: 84 89 | 47 117
77: 47 86 | 84 71
135: 32 84 | 2 47
133: 47 15 | 84 128
42: 19 84 | 62 47
30: 47 100 | 84 74
27: 6 47 | 91 84
63: 84 55 | 47 47
62: 84 87 | 47 23
76: 84 84
4: 84 135 | 47 54
60: 41 47 | 37 84
100: 47 47 | 84 47
85: 47 112 | 84 18
116: 125 84 | 63 47
134: 57 47 | 115 84
34: 52 47 | 25 84
40: 47 47
111: 58 84 | 126 47
3: 29 47 | 130 84
114: 17 84 | 107 47
52: 47 45 | 84 74
10: 47 100 | 84 81
98: 47 76 | 84 100
112: 84 82 | 47 103
72: 40 47 | 45 84
126: 50 84 | 113 47
107: 84 47 | 47 84
11: 42 31
55: 84 | 47
54: 12 84 | 5 47
130: 34 47 | 70 84
84: "b"
127: 81 47 | 17 84
87: 84 53 | 47 9
101: 105 84 | 14 47
9: 88 84 | 120 47
73: 47 79 | 84 22
97: 74 84 | 50 47
117: 74 47
70: 47 134 | 84 46
58: 47 50 | 84 115
125: 47 47 | 55 84
46: 47 81 | 84 17
86: 84 90 | 47 85
25: 38 84 | 63 47
69: 39 47 | 78 84
43: 47 100 | 84 125
93: 84 66 | 47 35
44: 47 21 | 84 36
16: 57 47 | 107 84
71: 48 84 | 4 47
babaaabbbababababbbbabbaabbaabaa
babaaaabaaaaababbbbaaaaa
abbabaabbaaabababaabbbbabbbbbaabbbbabababaaaabbbbababbbb
bbbabababbabbbabbbabbbbb
babaabbbababbbabaabaaaaa
abbabaabbaababbabababbbababbbabbabbabbbabbaabbbb
aaaaabaabbbbbaabbbbbbbbbbaaabbaaabbaabab
baababbabbbabbaaaaaababbaabbababbbabbbbb
aaabaaaabbabbbabbabaabbbabaabbbbaaaaabaaaabaabaaababaabbabbaaaabbbbaabbabbabaaaaaaaabaab
ababaaabababbbababaaabab
bbbbabbbbbaabaaaaaabbbbbbabbbabaabbaaababbbaaaaababaabaabaabababbabbbabbabaaabbaaabbaaaa
babaabaaababaaabaaaababa
aabaaabbaabbbabbabaabaab
bbbaabaaaabaaabbbaaabbbabbbaaabb
aaaaaaabaaababbbbbbbbbbbbaaabaabbaaabbab
bbabbabbaaaaabababaababa
babbababbbabbaababaababbaaaaabaaabbbabba
bbbbbbbababbaaaaabaaabbaabbaaaab
bbbbbaaabbbbbaaaaaabaaaabbbaaabb
babbababaababbbbbbbaaabb
abaabbaabbababaabbababba
abaaabbaaabaabbbabababba
babaaaabaaaababbabbbbaaa
bbbbbbbabaababbaaaaababbabbaabbabbbaabaababaabbbbbbaabab
aaabbabbbaabababbaabaaba
bbbababbabaabbabbbabaaaa
baabbabababaaaabbbbbbaab
bbabbbbabaababbabbbaabab
abaabbabbbabbabbabbbabba
bbbbbbbaaababaaabbaabbbabbaaabbbbabababb
aabbaaabbabbabaaaabbabaababbbaababaabababaaabbaa
aaabaababbbabbbbaaababbbbaaabbbb
aaaaaaaaaaabaaaababbabbb
bbbabbbbaabaababaabbabab
baaabaabbaaaabbbbaaaaaaa
bbbbbbbaabbabbaabaabaaaa
aaaaabaabbabbaaaaaaaaabb
aabaaabbaabbabaaabbabaabbaababaaabbbaaaaababbaabaaabbaaabbaaabaa
bababbbaaabaababbbababaabbaabaabbaaaabbabbaabababbbabbbababbabbb
abbbaababbaabaaaaababbbaaaabbbaa
aababbbaaaabaabbbbabaaaa
aaaaabbaaabaaabbbababaaa
bbbababaaabaaaabbabbabaabbababababababbbabbaaaaabbababbabbbbabbbabbbaabb
bbbabababbbabababababbbb
bbaaababbbabbbbaabbbbbaa
bbababaabaaaabbaabbbbaaa
bbbbabbababbbbaabbaaaababbababbaabaaabababbabbabbbbbbaababbbbabbbbaaaaabbbaabbba
abbabbabbbbbbaabaaaaabababaaaaabaaabbaaaabababba
bbbabaabaababaaabaabbaaa
bbababbbbaaababaaaabbabbaaabbbaa
aabbbbababaabbaabababbaa
aaabbabbbaabbbabbbbbbbbabaaaabbaaabababaabaaabab
aaaaaaababbabbabbabaaaaa
aababaaaaaababbbabbabbabaaababbbbbabbababababaaaabbabbbb
babaabbbbaaabaaabbbabbab
bbbbabbbbaabbbabbbaabbbaabbbbbaabbbbaaabbbbaabbbbaababbaaaabaaaabbabbabbabbaabbb
aaabbbabbaaabaabbaaaaabaabababab
abbababbabbbbbabbaabbbabaaababbbbbbbabaababbbbbabababbbb
bbaabbbaaaaababaaabaaaabbbbbbaabbaaaabbaabaaabaabaaaabbabbabbbaabbaaaaaa
abbabbaaaabaaaabbbbbbaabbabaababbbbabbba
bbaaaabaabbababbbbaabbaa
aabbaabaabbaaabbaaabaaaaaaababbabababbaa
baaaabbaaaaaabbbbabbababbaabbbbabbabbabbaabbaabb
babbaaaabbaabaaabbbbaaaabbbabbaaaaaaaabb
aaaaababaaabbabbababbabb
abbabaaaaaabaababbabaaab
aaabaababbaabbbaababbabb
babbabaabaababbabbabaabb
abbabbaabbabbbabababaaaa
bbabbbaaaababaaaaaabbbaa
bbbbbbbaaaaaabbabbbaabaaaaabbaaa
bbbaabaababaaabbaababbabaababaabbbababba
bbaaabbaabaabbbbbbbaababbbaabaabaaabaababaaaaabbbaaabaababaaaaabaabbbbaabaabbbaa
baabbababbaaaaababaabbabaabbbaabaabbaabbabbbaaababbaaaab
bbabaaaaaaaabababaabbababbaabbbbabbbaaababbaababaabaaaaaaaabaabb
baaaaaabbaababbaababaaaa
bbbabbbbbbaabaabbaaabbab
babbbabababaaaabaabbaaabbbabaabababbbaaabaababbbbbaababbbabbbabb
aabaaababababababaabbbababbababbbabbaabb
bbaabaaabbaabababbaababaabbabbba
bbbabaaaababaabbaabbabbbbabbaabaabbabaabbaabaabaabbaabbabaaabaaa
abbaaabbbbbbbbbbaaabbaab
baabbbbbaabbaabbaabbababbaabaaba
baaaabaaabbbbaabaabbabbbbaababbb
abbbbbbaabbbbbbbbbbbbaaaaaaabaaa
abbbbbbbbbabbbaabbbaaabaaabababa
aababbbaabbabaabbabaaaba
bbabbaabbabbabaaababbbba
aaabbbabbaabaabbbbbabbbbaaaaabbbbabbbabababbbaaa
aaabaabbaabaababaabababb
bbababaaabbbaabaabbababa
baabbbaaaaababababaabbaababbabbb
babbbaabbaaaabbaababbabb
bbababbbababbbaabbabbbabaabababaaabaaaaa
babbbbbbbbabbbababbbbaab
abaabbbbbabbbbbbaaabbaba
bbabbbaabbbbbaaabbbaaaaa
abbbbbbbbaabbbaaabbbbbbabaaaabaaaaaabbbb
aabaaabababbbbbbaaabbaab
bbbabababbbbbbabbbbbaabaabababbaaabbbbbb
aababbbaaaaaaaaaabbaaaaa
ababaababaababbbabbbbabaaabbabaaabbabbaabbaaaaaababaabba
aabbaaabaabbbaabaabaabbbaaabaaab
aabbaaabaaaaabaaaaabbbabaaabaaaababaaaaaabbbbbaaaababbaa
babbbaabaabaaabababbabaababbbaabbabaabbaabababbababaaaaa
aabbbbabababbbaaaaabaabbbaabbabaaaabababaabaaaabaaaababaabbbabbaabaaabbb
bbbbbbababbbabaababbabaabababababaababbabbbbbbbabbaaabbb
bbabababaaababbabbababba
abbbbbbabbbbbbaaabbbaabbbbabaabaaaaaaabb
aaaaabbbbaaaabbabbbabbab
aabbaaabbbbaaaabbabababbbabbaabbbbababbbbaaabbbababaabbbaabaaaaababbbaaa
ababbbabbbabbbaaababbbbbaabbabbaababbaaa
abbabbababbababbbbbbabbb
aabbaabaabbabbabbaabbaab
baabbbaaabbababbabbaaaba
baaabbbaaabbbabbbaaaaaaa
bbaaababaaaaabaabaaaabba
aabaaabbbbabbaabaaababaabbbbaabb
bbbbabbaaaabbabbaabbabab
aabaaaabbaaaaabababbabba
bababbbabaabaabbaaaabaab
ababaaabbbaabaabbbaabaaababaabbbabaabbaaaabbbaaabbbaabab
aababaaabbbbaaaaaaabbbbb
abaabbaabbbbbaaaaaaabaaa
babbbabababbaaaabaaaabab
abbbbbabbabbaaaababbaabb
bbaaaaabbbbababaaaaabaab
bbaababaaaabaabbabaabaab
bbababbaabbbbabbbaaaaabbabababba
bbabbaabbbbbabbaabababbbaabbbbbabaabbaaabbbabbbabaabbaab
abbabbaabbaaaaabbbabbbaabbbabaaabbaaabbbaaabaaab
aaababbababbabaabaabbbababbabbabbbaababaabbbabbaabaababa
baabbaabbbabbababbaaaaaabaaabbab
aabbabaabbbbbbbbbaabaaababaaaaaa
abbaabbabaaaaabaabbbabaabaaabaabaabaabbbaabaabaaaabaaaaa
baaaabbabaababbababbbababababbbb
bbabbaabbaaabbbabaaabaababbbbbbabbaaabaa
baabbbbaabbbbbbabaabbaab
baaaabbaabbababbaababbababaaaabbbbbbbabababaaaba
baabbbbbaabaabbbbbabbaaaabbaabbaabbbbbabbbbbbaba
babaabbbbbaabaaaabaababbabbbbabbbbbaaaaa
baabbababbaababaabbbaaab
bbaaaabbbaaaaaabbbabababbaabbabbbaaabbaaababaabb
abbbbbbaaababaaababbaaba
baabbabababababaaaaaababbababbbabaabbbaaabaaabab
aaaaababaabaabababbbbbbbabbbaaba
bababaaabbbaabbabaaaaabb
aabbaababbabbbbabbbaaaab
bbbbbbbbaabbbabbbabbbbba
aabaababbaabaabbbbaaaaababaaaaabbaaaaaaa
aaaaaaaaaaaaabababbbbbbabbbaabab
bbbaabaaababbbaaaabaaababbababbbabaaabbaabaaaaaa
ababbabbbbbbaabbaaabbaaabbaaabbaaaabbbba
baabababbbbbabaaababbbaabbaaababbbbaaaababbabbbb
bbaabbbaabaaabaaababaabb
bbabbbaaabbaabbbaaaabbaa
bbbabaabaaaaabaaaababaaaabaaabaaaaaaabbaabbaabbabbbbbaba
baaaabbaabbbaabaabbabbaabbbaaabaaabbbbbaaaaabaab
bbabbabbbbbbbaabbbababbbbbaabaaaaaabbaaa
abbbbbbbabaaabbbabbaaaabaaabababaabaabababbbaaaaabaaaababbababbabbbbabbb
baabbabaababbbaabbababba
bbaabbbaaaabbbbaaabaabaa
baabbabaabbbbbabaaaaabaababbbbaaabaaaaaa
baaabaaabbbababbababaaabaababbaa
aaababbabbaaaaabbaabababbbabaaba
aabbbaabaabbaaababbbaabb
bbbbbbbbbaabababaabaabaa
ababbaaaaabbbbbaaaabbaabbaaabaaabaabbaabbabbbababbbbabbabaaaaaababaaaaba
baaaaabaaaaaababaabbaaaa
aaaaaaaabbabababaaaabbaa
aababaaaababbbaabbbaaaaa
aaaaaaabbbaaabababbbaaab
aaababaaaabbbbababbaaaab
aaababaabaaaabbaabbaabab
bbaabaaaaaabaabbbabaaabbababaaba
ababaaabbaaaabbabbaabaaaabbababbaababaaababaabbbbabbabbb
aaaaaaabaaababbbbbaaaabbbbabaaaabaaabbabbaabbbab
abbabaaaabaaabbabbabbaaaababbbbbbbbaaaaa
abaaaaababbbbbababbbbaba
abaabaaaaabbbbaaaaaabaab
babababaaababaaaabaababa
bbbaaaaabbbbbbaaaabbaabb
aababaaaaaaaabaaabbbbaab
ababaaabababbbaaaaaabbab
baabbbabbbaabbbaabbbaabb
baabbbbaabbbaababbababba
bbbbabaaaaaababbbaababaa
aaaaabbabbbaabbaabaabbbaaabababababbbbba
baabaaabbbaabaabababaabb
aaabaaaaabbabbaabaabaaaa
aaabaabaabbabbabbabaabab
babaabbbbaabbbbbabaaabbabbaabaaabbababbababbbaaaababaabb
baaabaaababbabababbaaabbbaabaaabbaabaaaa
baaabaabbbababbbabbbbbabbabbaaab
abbabaaaaabbbbbababbaaaaaaaaababbabaababaabbbbbb
abbbbbbaabbbbaaababaabaaabbbbabbabbbbababbababbababaaaabbbaaaaba
aaabaabbabbbabaaabbaaaaa
bbbbaaabbbbabaaabaaabbbb
babbbaabbaabbbbbaaaabaaa
aaaaabaabaabaaabaabbaababbaababb
baababbbababbabbbbbbbaabaaaaabbababbbbbabaaaababbbbbbbbbbbaaaaabbabaaaabbababbab
baabaabababaababaaabbaaa
aababbabababaaababbabaaabbababbaabaababa
bbabbbabbabbbaababababba
abbaabbbaababaaaabbbabab
aaababbbabaabbbbbbbbabbb
aabbbbabbaaabaaaabbbaabb
abbbbbaabbbaabababaabaabababbaba
aaababaabbbbaaaababaaabbbaabbabbaaaabbaaababbaaa
bbaaaabaabbabaaaaabbaaabbbbabbab
aaabbababbbbababbbbbaaaababaaaaaababbaababaababbaababbbaaabbaaba
abbaabbbbabaabbbababbaab
baabbbbbbbaaabbbbababbbbbbaaaaaaabbbbbaaabaababa
aabbbbabbbbababbbabaaabbbabbbbbbbaaaabab
baabbbaabbabbbbababbbbaa
babbbbbbabbbbbbbaaabaabbbbbbbbbabbaaabaa
bbbabaaabbbbbaaaaaabbaab
abbbbbababaaabbaaababbbabbaaaaabaaaaabaabaaaaabb
bbabababaabbbaabaaabbbbabaaabbab
aaabbbbabbbbaaabbbbabbbbbbbbabbbaabababb
baaaabbaabbababbbabaaaaa
baababaabbaaaaabbababaabbbababbbababbbbabbabbaabbaaaabbabbaaabbbbbabbabbabbbabab
aaaaaaaaaabbbbababbbbabb
abbaaabbbaaaaaabbababaab
abaabbbbbaabbabaaaabababaabbababaaabbaab
aaaaabaabaababbaabbbbaba
bbbbbaaabbabababbaabbabaabaaaabaaabababb
aaaaabbaabbabaaaabbabbbabbbaaabbbaabaaaabbaaaaaa
aaabaaaaaaaaabbaaabaaabbbaabbbabaaaaabbbbabaaaaa
abaababbaababbbbaaabaaaabbbbbbbaabbaabaa
abaaabaabbbbbbabaabbbabbababaaba
bbabbaaabbaaaaababaaabbaaabbbabbbbbbabbaaabbabba
aaaaaaabbaababababaabbaababbaaaabaaabbab
bbbbbaaaaaababbbbaabbaab
abbaabbbbbaaaabbbbbbaaaabaabbabbaabbbaabbbaabbab
aaaabbbababaababbbbaababaababbaabbbabaababbbaabbbbaabbbaababbbaa
abbabbaaabbbaababbabaaab
aaaaaaababbaaabbbbaababb
baaabbaabaaabbaaabbbabba
babbbaabbbabbaabaabbaabaaabababa
aaaababbabababbbababaaabbbabaababbaababaaaabaabaabbabaaabbbaabaa
aaaaaaabaabbabaaabbabbaaaababbbbabbabaaabaaabaabaaaabbbaaabbbaaa
abbbbbbbbbbbabbabbbbaabb
baaabbbaabaababbaaabbaba
bbbbbbabbabbbabbaabaababbbbaabab
aaaaababbbbbabbbababbaabbbbbbabbaabbbbbbbbaaaaaa
ababaabbbababbbbbbbaaaabaabbbaaa
aaaababbbbbbabbabbaabbaa
aaabaababbbababbbabbabbb
bbababaaabaaabbaaabbaaaa
aaaaababbbaabbaaaaaaaabaabbbababbbbaabab
aabbaabbbabaabaabaaaaaaaabaababbbabbbbbaababbabbababaabaaabbbabbaabaabbaaabbbbba
bbbbaaaabbabababbbaaaaaa
abaaaaabaaaaaaabaabbaaabaaababaaaabaaaaa
babbbaabababaaabababbaab
baaaaaababababbbbaabababbbbbbaabbabaaaabaaaaaabaaababbaa
aabaaabbaababbabbabaabbbaababbabaabbbbaa
ababbbbbabbbaabababbaaba
bbababababbbaaaaabaabbabaaabbabb
bbaabaabaabbbaabbaaaaaabaabbabbbabbbbaab
baabaabbaababbbabbbbbaba
aaaaabababaaaaababababba
abababababbbabbbbababaaa
ababbbaabbabbbbabbbbbbaaabbbbabaabbabbba
babaaaaaaaabbaaabbbaabab
abaaababaaaabaaabaaaaaaabbabbbaaaababababaaaababaaaababbbbabaabbaabbbbba
aaababbbbaaaabbbaaaaaaabbbbabbbaaabbbbaa
babababaaaaababbabaabaab
bbaabbbababbabababaabaababbbbabaabbaaaaababbbbab
abababbbaabbbbababbbaaaaaaabaaab
aabaabaaaaaababaabbaaaabaabaaaaaaaababaa
aabbbaabbbbbabaababbabba
abbbaabaaaaaaaaababbbabbbbaaaababbbbbababbbaaaaa
aaabbbabbbbababbbbaabaabbaaaabab
aabbaababbabbbabbbbbbaba
abbaabbabbbbaaaaabaaaabbbaaababb
aaabababbbbbaaaabbbababb
abbbbbbbaaabaababbababababaabbbaabaabaaa
bbbabababaabbababaabbbbabaababaa
bbbabbabaaaabaaaaabbaaababababababababaaaaaabbbbaaaaabaabbaababb
aabaaabaaaaaaaababbabbbb
aabbabaabaabbabbaaabbbbaaabaabaa
bbaaaabbbbbabaaabababbbaaabaaababababaab
bbbbbbbaaabbbbbaaaaabbab
babaabbbbaaabaaabbbababbbbbaabaaabbbbaba
bbaaaabbbbbbaaaaabababaaaaabbaaabbbaabba
bbabbbababaabbbbaabaaabaaaabbaaa
baabaabbabaababbbbaabaabbaabbabbabbbbababbaaabbb
babbbabaabbbaababababbab
aabaaabbabaaaaabbbaaaabbaaabbaba
aaaaabaaabaabbbbaabbbbbb
aaaabbbabbababaabaabbbaabbbbbababababababbbaaabbaaabbabaaababbba
abaaaabbabbbbbabbbabbbababbaababbbaaabba
abababbbbaabbbbbbabbbbbbabbbbbabaaaababbababaabb
abaaabbabbababbbabaababbbaabbbbababbbaabbbaabbaa
babbbbbbbaabababbbababaaabbabbaabaabbabbaabbbaaa
aaababbababaaaabbbbaaaaa
babaaabbaabbbbbaaaaababa
aaabaaaaaabbaababaabbabababbaaaabbaabbaa
abaabbabbbaababaabbbaabababbabaabbaaaababbababaaabbbabbb
bbbbababbbaabaabbabaaabbaababbaaabaaabbb
baabbbabaaaaaaabbaabbaab
bbbaaabaaaababbbababaabbbbbbbaabbbbababb
babbaaaababbabbaabababbbababbbabaaababaa
aaabababaabbabaabbbabaaababbbbab
bbbbababbbabbbababbababbbaababaababaabba
bbbababababbbbbbabbbaaaaabaabbba
aabaaabbabbbbbaaabaababaabaaabab
bbabbabaabaaaaaababbbbaa
abaabaabaaaaabaabbbbbabababbabbbaabaabaa
bbabbbaababbbabbaabbaaabbabbabaabaaabaaababaabaabbbabbababbbbabbbabbabbabbaabbbb
aaaaabaababbababababbbbbaababbabbbabababbbbbabbb
abaaabbabbabbbaaaabababb
abbbbbababaaaaabbabaaaaa
bbbabbabaaabbaabbaaaabaababbaaab
bbbbbbbbabaabbaaaabbbaaa
baaabbbaaababbbbabbbabbbabaabaabaababaab
aaaababbbbaabbbaaaaababbbabbabba
bbabbbaaababaaabbbbbbbbabbaabaababbabbba
aaabababbabbbabaaabbabaaaaabbaba
aabaabbbbaabbbabaaabbbbabbbbabbb
bbbbbbabababaaababaabbbbaabbaaaabababbbb
abaaaabbaaabaabbbbaaababaaabbaabaabbbbbb
baabbababbbaaabaababbbba
baaabbbabababbbaabbaabab
babababaaaabaaaabbbbabbb
babbababaaabbbbabbbaabaabaabbbbbaaabbbab
baabbaabbababbababbaaaaa
bbababbbaaaaaaaabaabbbbaaaaabaaa
abbbaabbbbbbbbaabbabbbabbbbbabaaababaaab
bbaabbbababaabbbbabaaaba
baaababababaabbbbbabbaba
abababbbaababbbbabbabaabbaabbbaaabbbaabaabbbbaaa
bbaaaaaaaaabababbaabababaababbbbbbbbabaaaaabbabbbbbbbbaabaaaaabbbababbaaaaababaa
baaaaabaaaaaaaaaabbabbba
baabbbbaabaabbabbaaabbbb
abbabbabaabbabaaaabbabab
abaabbbbbaaaaababbabaaba
bbbbbaaabbaabbbaabaaabbaabaaaaabbaabababaabbabbbbabbaabb
babbbabaabaaabbaabbbbbaa
bbabbaabbabbabaabbaaaabaaaabbaab
aaaababaaabaaaaabbabbabaababaabaaabbabbb
abbaaabbbbababaabaaaabaa
baabbbbabaabaabbbaabbaab
baababbabbbabaabaaabaabbbaaabaaabbbbbaba
bbbababbaabbbabbbbbbbbaa
bbbbbbabbbabbabbabbaabbbaaabaaab
bbbababbababaaababaaabbabaababbb
baabaabbaabbabaabbbaaaab
bbaaaababbabababaaabaaaaaaabaabaabbbbaba
bbabbaaabbbbbaaabbbaabab
ababaaababbabababbaababb
aabaaaababbabbabbabbbbaa
aaaabaaabbaabbabababaaaaabbbabbb
abbbabaabbabbbaaaabaaababbabbabbbbaabaababaaabbb
bbaaaabbaabbaaabaaaaaaabaaabbbbaaabbaabaaababaaabbaaabaa
babbbabbaaabababbbabaaab
abbabbabbaabbababbabbbbaaaaabbbabbababba
abbaababbbaabbababbbabbaaabbbbbaaaabababaabababbbbaabbbaabbabaabbbbbabbaabaaaaab
babbbabaababbbabbbbabbba
baaabaabaaaaaaabbabaabba
baabaabbbaabaaabbbabbaaabaaaaaabbbbbaabb
bbababbbabaaaabbbababaaa
baababbaaaabbbbaabbababbaabbaabaabaabbbabbabaaab
bbbbbbaaabbbababbaababbbbaaabbaabbaababb
bbabbaaabaabbbaababbaabb
ababbbababbbbbbbababbabb
babababababaaaaaaaaababababbaaabbabaabab
abaaabaaabbaabbbbabbaaba
aaaababbbabbbbbbbbbaabba
babbbabaaababaaabaaababb
ababbbabbbabbabbbbababaaaaabbbaa
aaaaabbbaabbaababbbbbbbbbaaaabbbaaaaabaabbbbaabaaababbaabababbabbabbabbb
abbabaabbbabbbaaaaabaaaabbbbbaaa
bbbbabbaaabaabbbaabababb
bbbabbaabbbaabaaabaaabaabaaaaaabaabbbbaa
bbbababbbabaaaabaaabbaba
abbababbabaababbbaabbabaaaabaabbaaaabaaabbabbbbbababababbbbaabba
aaabaaaaaababbbaabbaabab
abaabbaabaaabababaaabbbababbbbab
aaaaabbbbbababbbbabaaaaa
aabaaabaaababaaaabaabaaa
aabaabababbbaaaabaabbaaa
babaabaababaabbbbbababbbaaababbaabbabaabbabbbbabbaabaaba
aabaaabaaaabaaaabbaabbbb
bbbbaabaabaaabaaaababbbabaabbaab
bbabababbbabbbbaabbbbaab
baabababbaabbbbbbaaabbbabbbabbbbbabaabbababbaaabaabababa
abbbabbbabbabbabbaaaabaabbbbbaaaabaabababaababaaaaabababaababbba
baabbabbbaabbbbaabaabbabaababbaa
abaababbaaaaabbbaabbbaabaaababbbbbaaababaaaaababbabbaabb
bbbabbbbababababaaabaaabbaabbabaabbabbbbaababaaaabbbabbbbbbabbbbaaaaababbaaaaaaa
aababbabaabababaaababbabbaaaaaaabbbbbbaabbaaabbbbbbaabbb
ababbbabaaabaababbbaaabb
abbbbbbaabbbbbbbbbababba
bbabbbbabbabbbaaabbabaababbbaaaaaabbaaaa
bbaabaababbbbbbbabaabaab
aaaaabbabbbbabbabaabbbbbbabbabaaababbabbaabbaaaa
abbaabbabbbbbbbbabababba
abababbbabbababbabbabbaabbbbaabb
baaabaaaaaaaabbabaaababb
abaabbbbbabaaaabbaaaabaa
bbaabaaabbaabaaaabbbbbaa
baabaaabbbbbbbbabbababaaabbaaaab
bbaaabababbaaabbaabaaabbaabaabbabaaaabaa
aababbbbbbabbabbbbabbbbaaabababb
abbbabaabbaaaaabaaabbaaa
abbbaaaabaaabaaaaaaaaaaabbaabbab
aaabaaaabbbbbbbaabbababbbabbbabaabbabbaabbbbaaaabbbaabbb
aabbaaabbbabbabbbbbaabaaaaaaaabaabbbaabb
babbbbbbaabbabaabaaaabab
aaaaabbbaaaaabbaaababbbaabababab
baabaabbbbbbbbbabbaabaaababaabab
aababbbbaaaabbaababaaaaabaabbbabbbababaaaabaaabbaaaabaabababbbabbabaabbabaabaaaa
aababaaaabbbababbbaabaabbbbababbbbaaabababababba
bbbbbbabbabbababaaaaabaabaabbbaabbaaabababbaaaab
abbaabbbaabbbbabbbabbaba
bbaababaabaabbbbbabababb
aabaabbbbbbbbbbababbababbbbbababbabbaaab
bbabbaabaabbaabababaaaabbabbaaaaabaaabab
babbaaaabbabbabbabbaabab
bbbababbabbababbbabbaabb
aaababbabaaaaaababbbabba
babaabaabaaababaaabaaabaaaabbabb

1728
2020/input/2020/day20.txt Normal file

File diff suppressed because it is too large Load Diff

404
2020/src/day20.rs Normal file
View File

@ -0,0 +1,404 @@
//! --- Day 20: Jurassic Jigsaw ---
//! The high-speed train leaves the forest and quickly carries you south. You can even see a desert in the distance! Since you have some spare time, you might as well see if there was anything interesting in the image the Mythical Information Bureau satellite captured.
//!
//! After decoding the satellite messages, you discover that the data actually contains many small images created by the satellite's camera array. The camera array consists of many cameras; rather than produce a single square image, they produce many smaller square image tiles that need to be reassembled back into a single image.
//!
//! Each camera in the camera array returns a single monochrome image tile with a random unique ID number. The tiles (your puzzle input) arrived in a random order.
//!
//! Worse yet, the camera array appears to be malfunctioning: each image tile has been rotated and flipped to a random orientation. Your first task is to reassemble the original image by orienting the tiles so they fit together.
//!
//! To show how the tiles should be reassembled, each tile's image data includes a border that should line up exactly with its adjacent tiles. All tiles have this border, and the border lines up exactly when the tiles are both oriented correctly. Tiles at the edge of the image also have this border, but the outermost edges won't line up with any other tiles.
//!
//! For example, suppose you have the following nine tiles:
//!
//! Tile 2311:
//! ..##.#..#.
//! ##..#.....
//! #...##..#.
//! ####.#...#
//! ##.##.###.
//! ##...#.###
//! .#.#.#..##
//! ..#....#..
//! ###...#.#.
//! ..###..###
//!
//! Tile 1951:
//! #.##...##.
//! #.####...#
//! .....#..##
//! #...######
//! .##.#....#
//! .###.#####
//! ###.##.##.
//! .###....#.
//! ..#.#..#.#
//! #...##.#..
//!
//! Tile 1171:
//! ####...##.
//! #..##.#..#
//! ##.#..#.#.
//! .###.####.
//! ..###.####
//! .##....##.
//! .#...####.
//! #.##.####.
//! ####..#...
//! .....##...
//!
//! Tile 1427:
//! ###.##.#..
//! .#..#.##..
//! .#.##.#..#
//! #.#.#.##.#
//! ....#...##
//! ...##..##.
//! ...#.#####
//! .#.####.#.
//! ..#..###.#
//! ..##.#..#.
//!
//! Tile 1489:
//! ##.#.#....
//! ..##...#..
//! .##..##...
//! ..#...#...
//! #####...#.
//! #..#.#.#.#
//! ...#.#.#..
//! ##.#...##.
//! ..##.##.##
//! ###.##.#..
//!
//! Tile 2473:
//! #....####.
//! #..#.##...
//! #.##..#...
//! ######.#.#
//! .#...#.#.#
//! .#########
//! .###.#..#.
//! ########.#
//! ##...##.#.
//! ..###.#.#.
//!
//! Tile 2971:
//! ..#.#....#
//! #...###...
//! #.#.###...
//! ##.##..#..
//! .#####..##
//! .#..####.#
//! #..#.#..#.
//! ..####.###
//! ..#.#.###.
//! ...#.#.#.#
//!
//! Tile 2729:
//! ...#.#.#.#
//! ####.#....
//! ..#.#.....
//! ....#..#.#
//! .##..##.#.
//! .#.####...
//! ####.#.#..
//! ##.####...
//! ##..#.##..
//! #.##...##.
//!
//! Tile 3079:
//! #.#.#####.
//! .#..######
//! ..#.......
//! ######....
//! ####.#..#.
//! .#...#.##.
//! #.#####.##
//! ..#.###...
//! ..#.......
//! ..#.###...
//! By rotating, flipping, and rearranging them, you can find a square arrangement that causes all adjacent borders to line up:
//!
//! #...##.#.. ..###..### #.#.#####.
//! ..#.#..#.# ###...#.#. .#..######
//! .###....#. ..#....#.. ..#.......
//! ###.##.##. .#.#.#..## ######....
//! .###.##### ##...#.### ####.#..#.
//! .##.#....# ##.##.###. .#...#.##.
//! #...###### ####.#...# #.#####.##
//! .....#..## #...##..#. ..#.###...
//! #.####...# ##..#..... ..#.......
//! #.##...##. ..##.#..#. ..#.###...
//!
//! #.##...##. ..##.#..#. ..#.###...
//! ##..#.##.. ..#..###.# ##.##....#
//! ##.####... .#.####.#. ..#.###..#
//! ####.#.#.. ...#.##### ###.#..###
//! .#.####... ...##..##. .######.##
//! .##..##.#. ....#...## #.#.#.#...
//! ....#..#.# #.#.#.##.# #.###.###.
//! ..#.#..... .#.##.#..# #.###.##..
//! ####.#.... .#..#.##.. .######...
//! ...#.#.#.# ###.##.#.. .##...####
//!
//! ...#.#.#.# ###.##.#.. .##...####
//! ..#.#.###. ..##.##.## #..#.##..#
//! ..####.### ##.#...##. .#.#..#.##
//! #..#.#..#. ...#.#.#.. .####.###.
//! .#..####.# #..#.#.#.# ####.###..
//! .#####..## #####...#. .##....##.
//! ##.##..#.. ..#...#... .####...#.
//! #.#.###... .##..##... .####.##.#
//! #...###... ..##...#.. ...#..####
//! ..#.#....# ##.#.#.... ...##.....
//! For reference, the IDs of the above tiles are:
//!
//! 1951 2311 3079
//! 2729 1427 2473
//! 2971 1489 1171
//! To check that you've assembled the image correctly, multiply the IDs of the four corner tiles together. If you do this with the assembled tiles from the example above, you get 1951 * 3079 * 2971 * 1171 = 20899048083289.
//!
//! Assemble the tiles into an image. What do you get if you multiply together the IDs of the four corner tiles?
use std::collections::{HashMap, HashSet};
use std::ops::Index;
use std::str::FromStr;
use aoc_runner_derive::{aoc, aoc_generator};
#[derive(Default, Debug)]
struct Tile {
id: usize,
pixels: Vec<u8>,
width: usize,
height: usize,
}
impl FromStr for Tile {
type Err = ();
fn from_str(s: &str) -> Result<Tile, ()> {
let mut it = s.split('\n');
let id = it
.next()
.unwrap()
.split(' ')
.skip(1)
.next()
.unwrap()
.strip_suffix(':')
.unwrap()
.parse()
.expect("couldn't parse tile number");
let rows: Vec<_> = it.collect();
let height = rows.len();
let mut width = 0;
let mut pixels = Vec::with_capacity(height * height);
rows.iter().for_each(|row| {
width = row.len();
pixels.extend(row.bytes());
});
Ok(Tile {
id,
pixels,
height,
width,
})
}
}
impl Index<(usize, usize)> for Tile {
type Output = u8;
fn index(&self, (x, y): (usize, usize)) -> &Self::Output {
&self.pixels[x % self.width + y * self.width]
}
}
impl Tile {
fn border_set(&self) -> HashSet<Vec<u8>> {
let mut set = HashSet::new();
set.insert(self.top_border());
set.insert(self.right_border());
set.insert(self.bottom_border());
set.insert(self.left_border());
let rev_set: HashSet<_> = set
.iter()
.map(|b| {
let mut b = b.clone();
b.reverse();
b
})
.collect();
set.union(&rev_set).cloned().collect()
}
fn top_border(&self) -> Vec<u8> {
(0..self.width).map(|x| self[(x, 0)]).collect()
}
fn right_border(&self) -> Vec<u8> {
(0..self.height)
.map(|y| self[(self.width - 1, y)])
.collect()
}
fn bottom_border(&self) -> Vec<u8> {
(0..self.width)
.map(|x| self[(x, self.height - 1)])
.collect()
}
fn left_border(&self) -> Vec<u8> {
(0..self.height).map(|y| self[(0, y)]).collect()
}
}
#[aoc_generator(day20)]
fn generator(input: &str) -> Vec<Tile> {
input
.split("\n\n")
.map(|s| s.parse().expect("failed to parse tile"))
.collect()
}
#[aoc(day20, part1)]
fn solution1(tiles: &[Tile]) -> usize {
let mut border_counts = HashMap::new();
tiles.iter().for_each(|t| {
t.border_set().iter().for_each(|b| {
let c = border_counts.entry(b.clone()).or_insert(0);
*c += 1;
})
});
let corner_tiles: Vec<_> = tiles
.iter()
.filter(|t| {
let matches: usize = t.border_set().iter().map(|b| border_counts[b]).sum();
matches == 12
})
.collect();
corner_tiles.iter().map(|t| t.id).product()
}
#[cfg(test)]
mod tests {
use pretty_assertions::assert_eq;
use super::*;
const INPUT: &'static str = r#"Tile 2311:
..##.#..#.
##..#.....
#...##..#.
####.#...#
##.##.###.
##...#.###
.#.#.#..##
..#....#..
###...#.#.
..###..###
Tile 1951:
#.##...##.
#.####...#
.....#..##
#...######
.##.#....#
.###.#####
###.##.##.
.###....#.
..#.#..#.#
#...##.#..
Tile 1171:
####...##.
#..##.#..#
##.#..#.#.
.###.####.
..###.####
.##....##.
.#...####.
#.##.####.
####..#...
.....##...
Tile 1427:
###.##.#..
.#..#.##..
.#.##.#..#
#.#.#.##.#
....#...##
...##..##.
...#.#####
.#.####.#.
..#..###.#
..##.#..#.
Tile 1489:
##.#.#....
..##...#..
.##..##...
..#...#...
#####...#.
#..#.#.#.#
...#.#.#..
##.#...##.
..##.##.##
###.##.#..
Tile 2473:
#....####.
#..#.##...
#.##..#...
######.#.#
.#...#.#.#
.#########
.###.#..#.
########.#
##...##.#.
..###.#.#.
Tile 2971:
..#.#....#
#...###...
#.#.###...
##.##..#..
.#####..##
.#..####.#
#..#.#..#.
..####.###
..#.#.###.
...#.#.#.#
Tile 2729:
...#.#.#.#
####.#....
..#.#.....
....#..#.#
.##..##.#.
.#.####...
####.#.#..
##.####...
##..#.##..
#.##...##.
Tile 3079:
#.#.#####.
.#..######
..#.......
######....
####.#..#.
.#...#.##.
#.#####.##
..#.###...
..#.......
..#.###..."#;
#[test]
fn test_generator() {
assert_eq!(
generator(&INPUT).iter().map(|t| t.id).collect::<Vec<_>>(),
vec![2311, 1951, 1171, 1427, 1489, 2473, 2971, 2729, 3079,]
);
}
#[test]
fn test_solution1() {
assert_eq!(solution1(&generator(&INPUT)), 1951 * 3079 * 2971 * 1171);
}
}

View File

@ -10,6 +10,7 @@ pub mod day17;
//pub mod day18;
pub mod day19;
pub mod day2;
pub mod day20;
pub mod day3;
pub mod day4;
pub mod day5;