2020 Day 19

This commit is contained in:
Akumatic 2020-12-19 19:52:12 +01:00
parent 4b42802cae
commit fab45e5cea
6 changed files with 746 additions and 1 deletions

150
2020/19/README.md Normal file
View File

@ -0,0 +1,150 @@
# 2020 Day 19: Monster Messages
Copyright (c) Eric Wastl
#### [Direct Link](https://adventofcode.com/2020/day/19)
## Part 1
You land in an airport surrounded by dense forest. As you walk to your high-speed train, the Elves at the Mythical Information Bureau contact you again. They think their satellite has collected an image of a **sea monster**! Unfortunately, the connection to the satellite is having problems, and many of the messages sent back from the satellite have been corrupted.
They sent you a list of **the rules valid messages should obey** and a list of **received messages** they've collected so far (your puzzle input).
The rules for valid messages (the top part of your puzzle input) are numbered and build upon each other. For example:
```
0: 1 2
1: "a"
2: 1 3 | 3 1
3: "b"
```
Some rules, like `3: "b"`, simply match a single character (in this case, `b`).
The remaining rules list the sub-rules that must be followed; for example, the rule `0: 1 2` means that to match rule `0`, the text being checked must match rule `1`, and the text after the part that matched rule `1` must then match rule `2`.
Some of the rules have multiple lists of sub-rules separated by a pipe (`|`). This means that **at least one** list of sub-rules must match. (The ones that match might be different each time the rule is encountered.) For example, the rule `2: 1 3 | 3 1` means that to match rule `2`, the text being checked must match rule `1` followed by rule `3` **or** it must match rule `3` followed by rule `1`.
Fortunately, there are no loops in the rules, so the list of possible matches will be finite. Since rule `1` matches `a` and rule `3` matches `b`, rule `2` matches either `ab` or `ba`. Therefore, rule `0` matches `aab` or `aba`.
Here's a more interesting example:
```
0: 4 1 5
1: 2 3 | 3 2
2: 4 4 | 5 5
3: 4 5 | 5 4
4: "a"
5: "b"
```
Here, because rule `4` matches `a` and rule 5 matches `b`, rule `2` matches two letters that are the same (`aa` or `bb`), and rule `3` matches two letters that are different (`ab` or `ba`).
Since rule `1` matches rules `2` and `3` once each in either order, it must match two pairs of letters, one pair with matching letters and one pair with different letters. This leaves eight possibilities: `aaab`, `aaba`, `bbab`, `bbba`, `abaa`, `abbb`, `baaa`, or `babb`.
Rule `0`, therefore, matches `a` (rule `4`), then any of the eight options from rule `1`, then `b` (rule `5`): `aaaabb`, `aaabab`, `abbabb`, `abbbab`, `aabaab`, `aabbbb`, `abaaab`, or `ababbb`.
The **received messages** (the bottom part of your puzzle input) need to be checked against the rules so you can determine which are valid and which are corrupted. Including the rules and the messages together, this might look like:
```
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
```
Your goal is to determine **the number of messages that completely match rule `0`**. In the above example, `ababbb` and `abbbab` match, but `bababa`, `aaabbb`, and `aaaabbb` do not, producing the answer **`2`**. The whole message must match all of rule `0`; there can't be extra unmatched characters in the message. (For example, `aaaabbb` might appear to match rule `0` above, but it has an extra unmatched `b` on the end.)
**How many messages completely match rule `0`?**
## Part 2
As you look over the list of messages, you realize your matching rules aren't quite right. To fix them, completely replace rules `8: 42` and `11: 42 31` with the following:
```
8: 42 | 42 8
11: 42 31 | 42 11 31
```
This small change has a big impact: now, the rules **do** contain loops, and the list of messages they could hypothetically match is infinite. You'll need to determine how these changes affect which messages are valid.
Fortunately, many of the rules are unaffected by this change; it might help to start by looking at which rules always match the same set of values and how **those** rules (especially rules `42` and `31`) are used by the new versions of rules `8` and `11`.
(Remember, **you only need to handle the rules you have**; building a solution that could handle any hypothetical combination of rules would be significantly more difficult.)
For example:
```
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
```
Without updating rules `8` and `11`, these rules only match three messages: `bbabbbbaabaabba`, `ababaaaaaabaaab`, and `ababaaaaabbbaba`.
However, after updating rules `8` and `11`, a total of **`12`** messages match:
- `bbabbbbaabaabba`
- `babbbbaabbbbbabbbbbbaabaaabaaa`
- `aaabbbbbbaaaabaababaabababbabaaabbababababaaa`
- `bbbbbbbaaaabbbbaaabbabaaa`
- `bbbababbbbaaaaaaaabbababaaababaabab`
- `ababaaaaaabaaab`
- `ababaaaaabbbaba`
- `baabbaaaabbaaaababbaababb`
- `abbbbabbbbaaaababbbbbbaaaababb`
- `aaaaabbaabaaaaababaa`
- `aaaabbaabbaaaaaaabbbabbbaaabbaabaaa`
- `aabbbbbaabbbaaaaaabbbbbababaaaaabbaaabba`
**After updating rules `8` and `11`, how many messages completely match rule `0`?**

40
2020/19/code.py Normal file
View File

@ -0,0 +1,40 @@
# SPDX-License-Identifier: MIT
# Copyright (c) 2020 Akumatic
#
# https://adventofcode.com/2020/day/19
import re
def parse_rules(input: list) -> dict:
return dict(rule.split(": ") for rule in input)
def read_file() -> tuple:
with open(f"{__file__.rstrip('code.py')}input.txt", "r") as f:
blocks = [block.split("\n") for block in f.read().strip().split("\n\n")]
return parse_rules(blocks[0]), blocks[1]
def regex_pattern(word, rules):
check = word.split()
pattern = f" {word} "
while check:
value = check.pop(0)
rule = rules[value]
if '"' not in rule:
check += set([w for w in rule.split() if w not in ("|", "(", ")+")])
replacement = "( " + rule + " )" if "|" in rule else rule
pattern = pattern.replace(f" {value} ", f" {replacement} ")
return pattern.replace('"', "").replace(" ", "")
def part1(rules, words):
pattern = regex_pattern(rules['0'], rules)
return sum([bool(re.fullmatch(pattern, word)) for word in words])
def part2(rules, words):
rules["8"] = "( 42 )+"
rules["11"] = "|".join(" 42 "*i + " 31 "*i for i in range(1, 6))
return part1(rules, words)
if __name__ == "__main__":
rules, words = read_file()
print(f"Part 1: {part1(rules, words)}")
print(f"Part 2: {part2(rules, words)}")

536
2020/19/input.txt Normal file
View File

@ -0,0 +1,536 @@
101: 64 33 | 14 121
130: 14 96
117: 64 14 | 14 14
48: 78 14 | 102 64
107: 14 14 | 64 64
56: 14 43 | 64 104
5: 107 14 | 106 64
67: 14 44 | 64 94
100: 14 39 | 64 103
32: 14 96 | 64 16
25: 64 107 | 14 96
37: 64 108 | 14 30
42: 95 14 | 27 64
113: 14 79
13: 14 136 | 64 116
83: 64 62 | 14 2
105: 14 108 | 64 117
28: 14 133 | 64 35
66: 64 106 | 14 96
41: 64 85 | 14 60
88: 16 64 | 108 14
49: 58 64 | 14 14
111: 52 64 | 114 14
3: 14 124 | 64 119
82: 14 17 | 64 47
116: 49 14 | 98 64
91: 58 6
127: 106 64 | 30 14
125: 56 14 | 100 64
23: 64 61 | 14 5
31: 64 9 | 14 109
86: 125 14 | 99 64
35: 64 49 | 14 106
10: 64 25 | 14 84
85: 92 64 | 132 14
46: 14 18 | 64 82
128: 78 14 | 79 64
79: 64 64 | 14 64
29: 135 14 | 68 64
87: 106 14 | 79 64
96: 64 14 | 64 64
27: 134 14 | 51 64
109: 76 64 | 86 14
9: 64 120 | 14 74
81: 64 131 | 14 93
12: 118 64 | 37 14
11: 42 31
108: 64 14 | 14 64
16: 64 14 | 14 58
63: 117 64 | 16 14
126: 64 129 | 14 15
53: 64 79 | 14 16
75: 105 14 | 88 64
93: 127 14 | 73 64
26: 36 14 | 97 64
124: 30 58
36: 106 14 | 117 64
21: 25 14 | 119 64
92: 64 96 | 14 102
131: 64 59 | 14 66
4: 64 108 | 14 106
44: 32 64 | 71 14
45: 41 14 | 67 64
94: 119 14 | 110 64
58: 14 | 64
38: 14 14
112: 75 14 | 21 64
104: 58 79
59: 14 16 | 64 98
114: 14 30 | 64 102
65: 96 14 | 6 64
68: 30 14 | 79 64
129: 29 14 | 12 64
39: 14 6 | 64 117
78: 14 14 | 64 58
115: 14 72 | 64 24
57: 64 122 | 14 22
71: 107 14 | 96 64
30: 14 14 | 14 64
64: "a"
106: 14 64
89: 28 64 | 80 14
20: 64 70 | 14 19
133: 107 14 | 34 64
34: 64 64
22: 96 58
90: 16 14 | 96 64
51: 14 46 | 64 112
69: 23 14 | 13 64
15: 14 55 | 64 3
123: 30 14 | 108 64
17: 117 64 | 78 14
40: 49 64 | 117 14
135: 64 34 | 14 108
47: 64 102 | 14 78
97: 14 34 | 64 117
2: 64 63 | 14 88
54: 14 26 | 64 77
118: 98 14 | 96 64
76: 69 14 | 54 64
102: 64 14
121: 114 14 | 130 64
99: 64 57 | 14 10
60: 130 64 | 65 14
98: 58 58
132: 64 117 | 14 30
74: 89 14 | 50 64
19: 78 64 | 6 14
1: 115 64 | 20 14
18: 53 64 | 128 14
72: 14 78 | 64 30
103: 34 64 | 38 14
52: 30 14 | 49 64
120: 83 14 | 81 64
70: 79 14 | 108 64
7: 64 113 | 14 40
24: 49 14 | 16 64
84: 30 64 | 34 14
110: 64 30 | 14 96
55: 14 90 | 64 37
62: 14 4 | 64 47
80: 64 48 | 14 91
95: 126 64 | 45 14
77: 14 87 | 64 35
14: "b"
134: 101 64 | 1 14
119: 14 102 | 64 102
0: 8 11
33: 14 92 | 64 123
6: 58 64 | 64 14
50: 111 64 | 7 14
43: 14 98 | 64 38
73: 102 14 | 6 64
61: 96 64
8: 42
136: 30 64 | 96 14
122: 58 49
ababbbaaabbbbbbbbaaaabaaabbabaabbaaababbabbbbbbaabbbbbbababbaaaa
aabaabaaabbabaaaabbbabbbbbbbaababbababaa
baaabbbabbababbbbaaabbab
babbbaabbabbbbbbbbabbbababbbaaaa
baabbaabbabbabbaabbbabababbabaaa
ababbbabaaaaaaababbabaabaabbaaaa
abbabbaaaabbbaaababbababbbbbbabbbbaaabbaaababbbb
bbbaabaababaaabbbabaaabbbbaaaabaabaaaaabaaababaa
ababaabbbaababaabbababbabbaabaabaabbababbbbababb
bbaaaaaabbbbabbabaaababbabaababbaaaabaab
bbaaaabaaaababbbbabbbbaababaabbaababbabbbabbababbbababaa
bbabbbbabbbabaabaabbbbba
aaabaaabaaabbbbabaaaababbbbaaaaa
bbaabbaabbbbbbaaabababbbaabaaabaabaabbbbbabbaababbbbbbaaabbbabaaababbaabbbbbaabbbbaababababaabaa
bbbbbabaabababbaaaaabbbb
ababababbbaaaaaaaababababbbaaabaabbbbbaa
aaabbabbaaaaababbaabaaaabaaababbbabaabbb
bbaaabbaababaaaaabababababbbababbabbbbabaaabbaaaabbbabaa
ababababbabaabaabaaababbbbabbbaabaabababaaaaaabb
aaabbbbaabbbaaabbbabbbababbababaaabababaabbbaaaababbaaaababaaaaabaaabaab
abababababbabaababababababbaaaababbaaaaa
aaabbaabbbbbbaaabaaaaaaa
abbaabbaabbababaabbaaaab
baaababbababbaaaababaabababbaaaaaabaabab
baabbabbababbbbbaaabbbbbbaaabaaabaaaabbbbbbababaaabbbabbbbababababbbaabb
baaabbbbababaaaaabbaaaab
bbababbaaaabbbbaabbaaaba
baababaabaabbbbbabaabbbabbbbababbaaabaaabbbbaabaaabbabab
bbabaabababbaaabaaaaaaabbabaaaaaaabaaaaa
baabbabaaabbbbaabbbbaaab
aabaabbabbabbaabbaabbbaaabaabbbbbbabbaba
baaabbbbababbaaaaabaabbabaabbabaabaaaaabaaabbaaaaabbabbbaabbabbbbaaaaabb
baaababbbbabbbaabbababbbaaabbabbaabbbbaabbbabbaabbbbabbb
ababbaaababababbaabbbababaabbbbbababbabbaababbbbaaaaaabbaaaaabba
aaabbaabaaabbbbabbbbaaaaababbbbb
baabbaababbaaaabbaaabbaa
bbbababababbbaaabbbaabab
bbaaabaabbaaababbbbbabbb
abababbabbabbaabaabbbabb
bbaaaaaaaababababaaaaaaa
aabaaabbbabbbbaaabbaabbaaabbbababbababab
babaaababbabbaaaabbaabbb
babababbbabaaabbbaaaaaab
ababbabbabaaabbabbbbbbbb
babbbbabaabaaabbbaaaabababbbabbbabbaaaba
bbaaaabbbbaabbbbbbbbaaab
bbbaaabbbaaaaaaabababaababaabbab
aabaabbababaaaabbbbbbbbbbbbbaabbbbbaabababbbababbabbaaabaabaabbaaabbbababbbbbbbbbaabbbaaabbbabba
abaabbbaaaababbaabbaabaabababbbabaabbabaaabbabaabbababaa
aaabbbbbbabaabbaabbaaaaa
bbabbbbababbababbaabbababaabbabbabbbbbbbabbaaabaababbaab
bababbbaaababbbabbaaabababbbaaba
abbababaaaababbbaaabbabbbbababbbbbababab
bababaaabbbbbabaabaaabbabbbabbbabbbbabbabaabbbbaaabbbbab
baaababbaaabbbaababbbbbaaaaabbbbbabbbabb
bbbbbbabbaaabbaababaaaaaababaaba
aabbaaababbbbaabbbaababb
aaabbabbaabaaabbaaaaaaba
ababbaaaabbaabbabaabbbab
aaaabbababaabbabbabaababbbaaaaabbbabbabbbbaababb
bbaaabaabbaaabbabbabbbaaabbbabbabaaaabaa
aaabaaabbaaaabaaaabaabbb
ababbbbaabababaaabbaabbaabaabbbaabbbaababbbbbbbaaabbabab
bbabbbaaabababaabbbbbbabbabbbbbbabbbbaba
abbabaabbbbaaaabababbaab
aaabbbaabbaaabbabbbbababaabaabbaabaabbaa
baaaababbbbbbbabaababbbaaaaabbbb
baababababbabbbbaaaabbbb
bbbbbaaaaaaabbabaaaabbba
bbbbabbababababbbabbbbaabababbbaabaaabbb
bbaaabbbabbbaaabbbbbbaab
bbababbabababbbbbbababbbaabbaaabbabaabaaaabaaaabaabbaaaa
abbabaabbabbaabbbabbaaabbbbbbaaaabaababbaaabaaaababbaabb
babbbbbbbbbbaaabaabbbbabaabbabbababbbabaabababba
bbbabbbabbaaabaaabbaabbabbbaaaba
abbabbaaaabaabbaababbbbaaababbabbbaabbba
abbabbababababbaabbbbaba
babbbaabaaabbbaaabaabbab
aaaaababaaababbaaabbbbaabaabbbaabaaababbbbaabbbabbbabbaaabaaabbb
abaaabaabbaaabbaabbaabaabbbbaaab
abaabaaabbabbbaaaababaabbababbbbabaabbab
abaaaabbaaaabbabaaaababb
aaabbaabbbaabbbbaabaabab
bbabaabaabaaaabababbaaaa
ababbbaaababbbaaaabaabbaaabaaabbaaabbaabbaabbbbabbbbaabbabbaaaaa
bababbbbababababbbaaaabaabbbbabb
abaaaaaabaaaabaaababbaaaaaabbbbaabbbaaab
abababbbbabaaabbbaaaaabb
bbbbbbaababbbaaabbbaabaababbbbabbbababbabbabbabbbbbaaaaa
bbababbbbaaababbaaabbbaabbbbaaaababbbbaaaaaabaabaabaabbbaababbaa
abaaabbabbaabaabaabbaaaa
abaababbbbaaaaabbbbaabbababababa
baabbbaaabaabbbabbaabbab
babbbbbaabbabbbbbabbaabbaabbbbbaaabbaaaa
babababbbbbabbbabbbbbbbb
ababbbabaabaaabaabaabbab
babbababbaaabbbbaaaabbaa
abbabbbbbbabbbabaaabbaba
aaabbbaababbbaaabaabbbaabbbaaaabaababbaa
aabaaaababaaabaaaababbbabbbabababbbaabbb
baaaabbbaabbabaaababbababbaaabbbaaaabababaaaabbbbabbaabbaabbaabbabbababb
aaabbbaaaaabbabbababbbbabababbbababababa
bbaabaabbbababbaaabbbabb
ababababbbabaabbababbbbaabbbbbaa
abbaaaabaaaababbabbababb
abbbababababbbaaabaaababaaaaaaabaaabbabbabbbaaaabaabbaaabbbaabab
aababababaaaababbabbabbb
babbbbabbabbbbabbbaaabbbaaabaababbaabaabbbbaaabaabbaababaaaaaabb
aaabbbaabaaabbbabbbbabbb
ababaabbaaabaaabbbbabbabaabbabab
ababbabbabaababaababbbbaabbbabaa
abbbbaababbabbababbaaabb
ababbbababbababaabbaabaabbabbbaabbababaa
abbbaaabbbaabaaabbbbbaabbaaaaabb
abbbabbababaaabaaabbbabb
bbbaabaabaabbbbabbbabaabbbababbaaaaaabbbabbabbbbbaaabbabaaabbbab
baabbbaabbbbbbababaaababaaaaabaaaabbbaabbaaaaababbbabbaabaaaaabb
aaaaaaabbaababaabbabbbabbababbbababbabaaabbbbabaabaabbbb
bababbaaaabaaabbbabaabbaabababbaaaaababa
abbabbbbaabababababbaaaa
aababbbabbaaaabababaabbb
bbbbbabbbaababababaaaaaa
babbababaabaabbbaabaabbabbababbbbaabaaabaaabbabbabaabbab
bababaaaabbbabbaaaaababb
aabaabaabbabbbbababababbabbabababaababba
ababbbabbabbababbbbbaaba
abaabababbaaabaaaaabaabb
abbabbabbbbbbaaabaabbbaaaababbbabbbaaaaa
abaaaabbbabbababbaaaaaba
bbabbaaababbbbabaaababaaabaaabbbabaababbaaabaabbaaabbbbb
aaabaabaababbbabaaabbbaaaaabbaaa
babbbbbaaaabbbaaaaabbbaabaabbabaababbbaa
babbbbabbbbbababaabaabaababbbababbbaaabb
baabbabaabaabbbaababbabbaaababbbbbbabbaabaaabbaa
abbabbaaaaabbbbabbabababaababbabbbbabbaa
aaaababababbbaaaaaababbbaaabaabaaabaabbabbaaabaa
baabaabbabbaabaabbbabbbabbaaabababaabbab
aabbaabbaabbbabaabbbbbaa
abbabbbbaaaabbabaabaaababbbabbbb
bbabbbbabbbaabaabbaaaabaaabbaaaa
abaaaababaaaabbabbbaaabababababaabaababb
babbbbbabbabababbbbbaabbbbababaaabbbabaaabbbaababbaaaaba
abbbabbabbbaabaaabaabbbb
babbbaabbababbaabbaaabba
bbaaabbaaabbaaabbbbabbbabaaaabbbaabbbbaaababaaabbbaaabbb
aaaaabbbabaabaaaabababbbabbbaabb
bbabbbabbababbbaabababaabbababbabbbababababaaaaaaaaabaababbaaabb
ababbabbbaaabbbbbabaabaabaabbbaababbabbb
bbbbbbaabbaaaabaabbabaabbbbaaaababbaababaaaabbbbbbaabbba
babaabbabaabbbbbababbbabababbbaabbbaaaaa
ababaaaaabbbbaabbaababbb
bbaaabbbbbbaabaaaabbbbba
bbbbbabbaaaaabbbababbbbaabaabababbabaaaaababbaaabbbaaababaaaabbaabbbbbab
babbaabbbababbbbbabaabbaaabaaabbbaabaaab
aabbbaaabaaababbaaaaaaababbbabaa
ababaaabaaabbbaabaabbaaa
bbbbbbaaaaabaaaaaababababbbababababababa
aaabaabaabaaabbaaaaaaaaa
babaabaaaabbaaabaaabbbaabbbbbbababbaabbb
abbabaabaabbaaabbbbbaaba
aabaaaababbabbbbabaaabababaabaab
bbabbbabbababbaabababbbaaaaaabba
aaababbabbaaabbaaaaaabbbbabbabbaabaabbbabbaabbabbbbbbaab
aaaabaaabbaaabbaaaaabaaaababbbaabbbbbabbbaabababbbabbaaaaaabaabbaabababb
bbbabaabbaabababaaaabbabbaaababbbbabbabb
babbbbaabaabaabbbbabbbaaabbaaaababbbbabb
ababaaaabbbbbabaabaababb
bbaabaabbbbabaaaababbaab
aabaaaabaababaabbaaabbaa
aaabaaaabbbbbabbaababababbbbaabb
babbbaaaabababaaababbaaabbaaabaaaabaabababaabaab
bababbbbaaabaaaaabbbaaabaabaabbb
abbbabbabaabaabbaaaaabba
baaababbbbaaabaabbabaabbabababbabababababbbbababaaabaaaa
bbabbbbababbbbbbbabbbaba
bbbbbabbbbababbbbbbbaaba
babbaabbbbabbbabbbbababb
bbaabaaabbbbbababababababbaabbaaabaaaabbbabbbaababaabbbbaaababab
ababbbabbbabbbbabaabbaab
bbaabbbbbababbaaabbaabab
aaabbaaaaaabbabbbabbbbbbabaabbbaaaaaaaaabbaabababbababaabbaababbabaaaabbaaaabaabbbbbbaab
abaaabbbbaaabbaababbbabbabbabbba
abaabbbababbbbabaababbab
abaaaabaabbabbaaaabaabab
aaabaabaaaabbbbbaabaabaaaaabbbaababbababbbbbbaab
ababaabbabaaabbaababbaba
baabbabbaaabbaabbbbaaaababbbbabaaababbbb
baaaababaaabbbbaaabbaaba
bbabbaababaaabbabbbaaaabbbaabbbababaabbb
aabaabaababababbaaabbbab
aababaabbbabaaaaaabbbbab
babbbbbaababbbaaaaaaabba
bbababbababbbaabbbabbabb
bbbaaaabbbababbabbaaababbabaaaba
bbababbbbbbbababaababaaa
babaaabbababaaaabababbaabbbaabab
ababaaaaabaaaabbababbabbbaaaaababaaaaabb
bbbbabbabbbbbabbbaaaaaaa
ababbbabbbaabaabbaaabaaa
baabbbaaaabbbbaaabbbbabb
bbaaabaabaaabbbbabababbbaabababababbaabbbbbababbabaaabbb
abbbaaababbbbbbbbabaabbb
ababaabbbbbbbbababbbbabbaabaaaabaaabbaabaaabbababbababab
abbaabaaaabbbbaaaabbabbb
bbaaabbbbbbbbbaaabbabbbbbabbbbaabaaaabbabbbaaabb
bbbabababbbbbbabbaabaabbbabbaabbbaabaabbabaabaab
bbbaaaabbaaababbabbabbbbabaabbaaabbbabbb
abbaabbabaabbaaababababaabbbaaba
babbbbbababbbaaababababa
abbbbaabaaaaababbabaaabbbaaabaab
aaabbabbbbbabaababbaaaaa
aaabbbbaabbaabbaaaaaaabb
babbaabbbbaaabababaaaabaaababbbaabbbaababbbabbaabaaaabbabaabaaabbbbaaaba
aababaabbabbbbaabbbababababbaaaa
abababaabbaaaabaababbbbb
bbbbababbbabbbbabaaababa
bbababbbaababababbbaabaaabababaabaaabbbbbaaaaaab
baabbbabbbaabbbaabbababbbbbaaabbbabbaaabbabbaabaabbbbbabababbbab
bbbbbabbbabbbbbbaabaabbb
abbabaabababaabbababbaba
abaaabaaabbabbbbababbaaaaaaaaabbaabbbabb
bbabbaabbbbbabbababbaaba
bbababbaaabababaaaaababa
baabbbaababaaabbabbbabbaaabbbabbabaaabbb
aaabbabbababbaaabbbabaababbaaabb
abbbbaabaabaabbababbbaabaaaaaaabaabbaabbabbabbba
babbabababaaaabbbabbaabbbbaaabbaabaababb
abbabbaabbbabaaaaabbbaab
babbaabbbbbbababaaababab
aaabaaaaaabbbbbbbaabababaaaaaaba
abbabbaababbababaabbbabb
abababaabbbabababbaaaabb
aaaaabbbbbbbbabaabbaaaab
bbabaababababaaabbaaabaababababa
aababaabbbaabbaababbbbbaaabbbbbaaabbabab
ababaabbbababbabbaaabaaaabaabaabaabbbbabbbbbbbbbabaabbaa
abbababaabaaababbaabbbaababbaabbbabbbabbbaababbb
bbababbabababbaaababbabbaabbaaababbaabab
aabbbaaababbaaabbbbaaaaa
babbbbaabbbabaababbbbaabbbaaaaaabbababbbaaababbabaaaaaba
bababaaaaabaabbaaabbaaaa
babbababbabbaabbbaabbbbbbbaaababbbabaababbabaaaabbbbaaabaaaabaab
aaaabaaaaaaabaaababbbaababbbbaba
baaaaabaaabbaabaaaaabaabaababbbb
bbbbbabaababbbababaabbbaabaabbbbbabbaaba
babbbbbbaaaaababbbbbababaabaaabbbaaababbaabbabbb
abaaaabaabbbbbbbbabaaaab
bababbbabbaaaaaaaaababab
abbabbabbbababbabbabbaabbaabaaaabbaababbbabaaaba
bbbbababbabababbabbabbabbbaaabaabbabbabb
aabaaabaabbabbabbaaaabaabbbbaaaabbaaabbbaaaaaabb
bbabbbabaabbbaaaababbbbabbbbbbbb
bbaaabbbbabbbbbaabbbaaaa
bbbbbabaaabaabbaaabbbbba
aaabbbbbbbbaabaaabbbbabb
baabbabbbaabbbbaaabaaabbababababbaaababa
aaaabaaaaabbbbbbababababbbbbaaba
baabbbbabaaaababababbbbababbbbba
babbaabbaaabbbbbbbbaabab
abaaaabbbaabbabaabbbaaababbabaabbaaaabbbaaabbaaaababbaab
bbaabaabbaabbbaabaabbabbbbbaabaabbbbaaabbbbaaaba
abbbababbbbabaaaaaaabbba
aabbbbbbbabbbbaaabaaabbb
bbaaaaaabbbbabbabaabbaaa
baaaabababaaabaaabaabaaabababaab
abaaabaaabbbababbbbababb
bbbabaaabaabaaaabbabbbbabbababbbbbbbaabaaabbbabb
bbaaaaabbbbaabbbbbabbabbbbababbaaaaaaabbbbbbababbaaabbbabbaabaabbaaaaaabbbbbaaba
abbaabbabaabbababaaaabababbaaabbabaaaaab
abbaabaaabaabbbabbabaaab
baabbbaabbbbbaabababaaaababbaabbabaaaaaaabbbbabbbaabaaaaabababbb
aabbaaabbbaaaabbaaaabbabaabbbaaaaabaababbbababab
baabbbbaabaaabaaabbaabbbbbaababababbaaba
abaabaaaababaaaaabaabaab
bbbbabbabbabaaaabaabbabababbbaababbbaabaabbbaaaa
abaaababaabaaabbbbbbbaaababaaaaa
ababbaaabbbbbabbaabaaaababaaabbb
aababbbbbababbaaaabbbabbabbbabababbbbbababaabaabaabbbaabaaabbbbb
babbbbbbaabaaabaabbababaabbbabbaababbbabababaabbbbbaaaba
bbbabaabbbaaaabbbbbababb
abbbabbaabaababaabbbbbbbbbababaa
aaaaabbbabbbbaabaaaabbaa
bababbbaabbabbbbaaabbbbbaabbabababbabbababaabbbbababbbbb
bbababbbabbabbbbbbabbbababaaaababbbbaaaabbbbbabbbbbbaabb
abbbababaabbaabbbbbaabab
aaababbabbbaabaaaaabbbbbabbbabbaabbababaabbbbbba
aaabbabbaababaabbababbbabbaabbbbabbbbbbbbaaabaaa
bbbbabbabbaabaabbaaabbbbbaabbabbbaababbbabaaaaaa
baabaabbbababbbbabaaabbbabaabaababbabbaaaabbbabaaaababbbbaaaabaa
bbabbaabbabbbbabababbbaabbabbaaabbbaabbb
ababaabbababbbbabbbabbbb
abababbabababbbbbbbababb
bababbbbbbbbbbaaaabaabbb
babbbbaabaabbabbbbbabbbb
baabbbbbbabbbbbbbbababab
bbbbabbababbbbbaaabbbbaaabbbbbaa
abababbabbbaaaaaaaabbbababababaaabbbababaaababbababbabbaaaabbaabaabbaababbbbaaba
abbaabaababbbbbbbaaaabba
abaabababbababbbabbbaaaa
bbbbbababbaaaabbaabbaaba
aaabbaabbaabbbaabbababaa
bbaaaabbabbabbbbaaababaa
bbbabaababaabbbbaababaaa
bbaaabbbaabaaababbbabbabbbbbbbbb
abbaabababbbbbbbbababbaabbbbabbbbabbbabaaabaabaa
bbbbbaaaaaaaababaaaaababbaababaabbbbaaabbababbab
bbaabbbbaabbbbaaabaaabaaaaabbabbaaaaabba
baabbbbabaabbabababbabaa
aabaabaabaaaabaabaabbbaaaaabaaababbbbbbbbbaabaab
ababbbaaaaabbbbbaabbbbbbbbbabbaaababbaab
babaabbaaaaabaaababbbbbababbbaabbababaab
baabababababbbaababababbbbbaabab
abaabababaabbabaaaaaaabaababbbbaaaaaaabaabbbbabaaaaaabbababbabbababaabbababbbaaa
babababbaaabaabababababa
aaababbbaababababbbbaaaaaaababbaabbbbbabaabaabbb
aababababbaabbbbbabbaabbbbbaaaaa
abaaabbaabbababababbaaababaabbab
aaabbaabbabbbbaaaabaabaabaaabbbbabbabbaabaabaaababbaaaab
bababbbbaaabbabbabaaaabbaaaabbbaabbabbbaaaabaabb
bbbabaaaaaabaaabaabbaabbbaaabaaa
babaabbabbbbababbbabaaaaabbaaabbaaaaaaaa
abbbbbbbbbaabbbbbbbaabab
ababbabbbbaaabbaaaaababb
abbbababbbaaaabbabababaaababaaabbaabaaabaaababaabaababbb
babbbbbbbababbaababababa
babaaabbbaaaabaaaaaaaaba
bbbabbbaaaababbbaaaababb
aaabaaabbbabaaaababbbaba
baabbbaaaaaabaaaaabababaaaabaabababaabbb
abbabbbbbaababaabaabbbab
bbbababbbbbabbabaababbbaabaabbbababbbbbbbbababbabbaabbabaaabaabaabaabaababaaaababbbaabaaaaaabbbb
baaabbbabababbbbbabbaaaaaaababaa
bbbaabaaaaababbbabbbabbaaaaaaabababaaaab
ababbbaabbbaabaaaaaaaaaa
baabaaaaababaabbabbbbbaa
aabbbaaaaaabbaabaabbbaaaabaabbaa
baababaaaaaabbabbbbabaababaabaab
abbbbabbaaabbabaabbbbabbbababbab
bbaaabbbabbabbaabbbaaabb
bbaaababaabaaaabaaabbbab
aaababbbaaaabbabbaaaabba
bbbbbbbbbbabaaaababbbbabaaabbabbaaaaabaabbabbbaabaabaabb
abbbababbbbbbabbabbbbaaa
aaaabaaaaabbaabbbaabbabbaaabaababbaabaabbabaaaaa
babababbaabbaabbbbbabaababbbbaabbbababab
abaaabaaabbbbbbbaababababbaabbbabaaababa
bbaabbbbabbabbabbbaaabbabbaaaaaaaabaaabbbbababaaabaaaabbbabbababbbbbaabbbbaababb
baabbbbbabbbabababbbababbbaaababbbabaabbbbaaabaaaaabbabaaaaaaabb
ababbbaabaabbabbaaabbbbbbababaaababaaaba
aaaaababbbaabbababbaabbbbbabaaabbaaabbab
aabbaabbaaaabaaaaabbbbaaabaabaaababaabbabaabbaabababbbbb
aaabbbbaaaaabaaabbbbabbabbbaababbbaabaaa
bbbbbbabbaabaaaabbbaaaaa
babbbaaabaaaabaabbbbbaabbbbbaabb
bbaabbbbbaabaaaaabbbaaaa
bbababbaaababbbaababbaaaaaaaabba
abababaabaabbbaababababbbaaaaaba
ababaaabbbaabbbbbabbaaba
abaaabbaaabbbbbbbabaabbb
aabbbbaabbaaaabbbabbbbbbaabaaababaabaababaaabbab
ababaaabababbbbaaabbbbab
abbbababbbbabaabbbbaabbb
aabbabaabaabbabbbbbbababababababaabbbabb
bababbaaaaabaabaaabbbbaaaabbabab
bbabaaaaaababbbaabbaaaaa
bababaaabbbbaaaaababaaaababbbabaabbaaaab
bbbbbaaababbbbbbabbbbbba
baabaabbbaaaabbabbbaabbaababbaab
aabbbbbbaaababbaabaaababababaaabbbbaabbaaaaaaabaaaababaa
bbbbbabbabbabaabbaaabbbbabaababaaababbabbabbabaa
aaabbabbabababaabaabaaba
abaaabbabbabbbbabaababbb
baaabbbbbbabaaaaaaaabbbb
baabaaaabaabbabaababbbabbabbabaa
babbababbbaabaabbbbbbabbaababbbb
aaabbbaabaabbbbbabbbbbab
baababbaabbbbbaaaabaabab
bbabbbababbaabaaaaaabaaaabaababababbbaabbbabbaba
ababbbbabaabbabaababbaab
ababbbaabbbbbabaaabbbaaaaabbbbbabbaabbba
babbaaababaabababbbbabaa
baabaabbbbbbabbabbaabbaaabaabbab
aabbaaabbbaaabababbaabaaabbbabababbaaabbbabbbabb
bababbbababbbaaabbbbbababbaabbaabbbbaabb
baabbbbbbaaaabaaabbbaaabbabbbbaaababbabbaaabaaaaaaaaabaaabbabaaaaabbbaabbbabbbbb
babababbabbabbbbbabbbbab
baaaababbbbabbabbbabaabaaabbbbba
babbbbabaabbaaababaaababaaabbabbbabaaababaaaaaaa
aabaaabaabbabbaaabbbbbaa
bababaaabaababaababaaaaa
ababbbbabbabaabaababaaaabaaaaabb
bbababbaabaabbbabbabbabb
baaaababbbbaabbbbbbbabaaababbaba
aaabaaabbabaabbaababbbabbaaabbaa
babaabbabbbbabbaabbabababbbbbaababbbabbb
bababbaababbbbaabbbabaaaababbababbbbabbb
bbbbbababababbaaabbabbaabbabbaabbaaabbbabaaabababaaabababbbababb
aabbbbbbbababaaaabaaaabbbbbaabba

2
2020/19/solution.txt Normal file
View File

@ -0,0 +1,2 @@
Part 1: 149
Part 2: 332

17
2020/19/test_code.py Normal file
View File

@ -0,0 +1,17 @@
# SPDX-License-Identifier: MIT
# Copyright (c) 2020 Akumatic
from code import part1, part2, parse_rules
import re
def test():
input = ['0: 1 2','1: "a"','2: 1 3 | 3 1','3: "b"']
assert part1(parse_rules(input), ["aab", "aba"]) == 2
input = ['0: 4 1 5','1: 2 3 | 3 2','2: 4 4 | 5 5',
'3: 4 5 | 5 4','4: "a"','5: "b"']
words = ["ababbb","bababa","abbbab","aaabbb","aaaabbb"]
assert part1(parse_rules(input), words) == 2
print(f"Passed Part 1")
if __name__ == "__main__":
test()

View File

@ -24,7 +24,7 @@ Collect stars by solving puzzles. Two puzzles will be made available on each day
| 13 | :white_check_mark: | :white_check_mark: || 14 | :white_check_mark: | :white_check_mark: |
| 15 | :white_check_mark: | :white_check_mark: || 16 | :white_check_mark: | :white_check_mark: |
| 17 | :white_check_mark: | :white_check_mark: || 18 | :white_check_mark: | :white_check_mark: |
| 19 | | || 20 | | |
| 19 | :white_check_mark: | :white_check_mark: || 20 | | |
| 21 | | || 22 | | |
| 23 | | || 24 | | |
| 25 | | |||||