Added Solution for 2020 day 19

This commit is contained in:
Burnus 2023-04-13 20:11:37 +02:00
parent 6f58a357be
commit 3a42d18f3e
5 changed files with 1036 additions and 0 deletions

View file

@ -0,0 +1,8 @@
[package]
name = "day19_monster_messages"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

View file

@ -0,0 +1,160 @@
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`?*
Your puzzle answer was `200`.
\--- Part Two ---
----------
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](https://en.wikipedia.org/wiki/Formal_grammar).)
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`?*
Your puzzle answer was `407`.
Both parts of this puzzle are complete! They provide two gold stars: \*\*
At this point, you should [return to your Advent calendar](/2020) and try another puzzle.
If you still want to see it, you can [get your puzzle input](19/input).

View file

@ -0,0 +1,231 @@
use core::fmt::Display;
use std::{num::ParseIntError, collections::{HashSet, BTreeMap}};
#[derive(Debug, PartialEq, Eq)]
pub enum ParseError {
InputMalformed(String),
ParseIntError(std::num::ParseIntError),
LineMalformed(String),
}
impl From<ParseIntError> for ParseError {
fn from(value: ParseIntError) -> Self {
Self::ParseIntError(value)
}
}
impl Display for ParseError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InputMalformed(v) => write!(f, "Input doesn't consist of 2 parts seperated by an empty line: {v}"),
Self::ParseIntError(e) => write!(f, "Unable to parse into integer: {e}"),
Self::LineMalformed(v) => write!(f, "Line is malformed: {v}"),
}
}
}
struct Rules {
char_replacements: Vec<(char, usize)>,
reductions: BTreeMap<usize, Vec<Vec<usize>>>,
beginnings: HashSet<Vec<usize>>,
ends: HashSet<Vec<usize>>,
}
impl TryFrom<&str> for Rules {
type Error = ParseError;
fn try_from(value: &str) -> Result<Self, Self::Error> {
let mut char_replacements = Vec::new();
let mut reductions = BTreeMap::new();
let beginnings = HashSet::from([Vec::from([42])]);
let ends = HashSet::from([Vec::from([31])]);
for line in value.lines() {
let components: Vec<_> = line.split_whitespace().collect();
if components.len() < 2 {
return Err(Self::Error::LineMalformed(line.to_string()));
}
let rule_idx = components[0][..components[0].len()-1].parse::<usize>()?;
if components[1].chars().next() == Some('"') {
if let Some(c) = components[1].chars().nth(1) {
char_replacements.push((c, rule_idx));
} else {
return Err(Self::Error::LineMalformed(line.to_string()));
}
} else {
let mut variants = Vec::new();
let partitions: Vec<_> = components.iter().enumerate().filter(|(_idx, c)| c == &&"|").map(|(idx, _c)| idx).collect();
if partitions.is_empty() {
variants.push(components.iter().skip(1).map(|i| i.parse::<usize>()).collect::<Result<Vec<_>, _>>()?);
} else {
let mut last_part_idx = 0;
for part_idx in partitions {
variants.push(components.iter().skip(last_part_idx+1).take(part_idx-last_part_idx-1).map(|i| i.parse::<usize>()).collect::<Result<Vec<_>, _>>()?);
last_part_idx = part_idx;
}
variants.push(components.iter().skip(last_part_idx+1).map(|i| i.parse::<usize>()).collect::<Result<Vec<_>, _>>()?);
}
reductions.insert(rule_idx, variants);
}
}
Ok(Self {
char_replacements,
reductions,
beginnings,
ends,
})
}
}
impl Rules {
fn find_beginnings(&mut self) {
let mut open_set = self.beginnings.iter().cloned().collect::<Vec<_>>();
while let Some(current) = open_set.pop() {
for (idx, rule) in current.iter().enumerate() {
if let Some(expansions) = self.reductions.get(rule) {
for exp in expansions {
let mut next = current[..idx].to_vec();
next.append(&mut exp.to_vec());
next.append(&mut current[idx+1..].to_vec());
if !self.beginnings.contains(&next) {
self.beginnings.insert(next.to_vec());
open_set.push(next);
}
}
}
}
}
}
fn find_ends(&mut self) {
let mut open_set = self.ends.iter().cloned().collect::<Vec<_>>();
while let Some(current) = open_set.pop() {
for (idx, rule) in current.iter().enumerate() {
if let Some(expansions) = self.reductions.get(rule) {
for exp in expansions {
let mut next = current[..idx].to_vec();
next.append(&mut exp.to_vec());
next.append(&mut current[idx+1..].to_vec());
if !self.ends.contains(&next) {
self.ends.insert(next.to_vec());
open_set.push(next);
}
}
}
}
}
}
fn is_valid(&mut self, message: &str, part_2: bool) -> bool {
let target: Vec<usize> = message.chars().map(|c| self.char_replacements.iter().find(|(rule, _idx)| rule == &c).unwrap().1).collect();
let mut targets = Vec::new();
let beginnings: Vec<_> = self.beginnings.iter().filter(|b| b.iter().enumerate().all(|(idx, num)| target.len() > idx && target[idx] == *num)).collect();
if beginnings.is_empty() {
return false;
} else {
for beginning in beginnings {
targets.push(target[beginning.len()..].to_vec());
}
}
let mut new_targets = Vec::new();
for target in &targets {
let beginnings: Vec<_> = self.beginnings.iter().filter(|b| b.iter().enumerate().all(|(idx, num)| target.len() > idx && target[idx] == *num)).collect();
if beginnings.is_empty() {
return false;
} else {
for beginning in beginnings {
new_targets.push(target[beginning.len()..].to_vec());
}
}
}
std::mem::swap(&mut targets, &mut new_targets);
let endings: Vec<_> = self.ends.iter().filter(|b| b.iter().rev().enumerate().all(|(idx, num)| target.len() > idx && target[target.len()-idx-1] == *num)).collect();
if endings.is_empty() {
return false;
} else {
let mut new_targets = Vec::new();
for ending in endings {
for target in &targets {
new_targets.push(target[..target.len()-ending.len()].to_vec());
}
}
std::mem::swap(&mut targets, &mut new_targets);
}
if part_2 {
while let Some(current) = targets.pop() {
if current.is_empty() {
return true;
}
// Ensure we reduce the beginning and end the same number of times. We can reduce
// the beginning even more in the else case.
let endings: Vec<_> = self.ends.iter().filter(|b| b.iter().rev().enumerate().all(|(idx, num)| current.len() > idx && current[current.len()-idx-1] == *num)).collect();
if !endings.is_empty() {
for ending in endings {
let current = &current[..current.len()-ending.len()];
let beginnings: Vec<_> = self.beginnings.iter().filter(|b| b.iter().enumerate().all(|(idx, num)| current.len() > idx && current[idx] == *num)).collect();
if !beginnings.is_empty() {
for beginning in beginnings {
targets.push(current[beginning.len()..].to_vec());
}
}
}
} else {
// We only ever enter this branch if we have (a) exhausted all endings, in
// which case we might as well retry searching for them -- they won't become
// available again since we don't touch the end, or (b) didn't get a fitting
// beginning. In that latter case, we either (ba) don't have a beginning at
// all, so we fail here as well, or (bb) have one without ending. That however
// breaks down into (bba) we will find a chain of valid beginnings, so we
// should pass, or (bbb) we don't, in which case we will fail by removing from
// the front.
let beginnings: Vec<_> = self.beginnings.iter().filter(|b| b.iter().enumerate().all(|(idx, num)| current.len() > idx && current[idx] == *num)).collect();
if !beginnings.is_empty() {
for beginning in beginnings {
targets.push(current[beginning.len()..].to_vec());
}
}
}
}
return false;
} else {
targets.iter().any(|target| target.is_empty())
}
}
}
pub fn run(input: &str) -> Result<(usize, usize), ParseError> {
if let Some((rules_str, msg_str)) = input.split_once("\n\n") {
let mut rules = Rules::try_from(rules_str)?;
rules.find_beginnings();
rules.find_ends();
let messages: Vec<_> = msg_str.lines().collect();
let first = messages.iter().filter(|m| rules.is_valid(m, false)).count();
let second = messages.iter().filter(|m| rules.is_valid(m, true)).count();
Ok((first, second))
} else {
Err(ParseError::InputMalformed(input.to_string()))
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs::read_to_string;
fn read_file(name: &str) -> String {
read_to_string(name).expect(&format!("Unable to read file: {name}")[..]).trim().to_string()
}
#[test]
fn test_sample() {
let sample_input = read_file("tests/sample_input");
assert_eq!(run(&sample_input), Ok((3, 12)));
}
#[test]
fn test_challenge() {
let challenge_input = read_file("tests/challenge_input");
assert_eq!(run(&challenge_input), Ok((200, 407)));
}
}

View file

@ -0,0 +1,590 @@
12: "b"
120: 113 12 | 68 106
101: 12 12 | 106 12
104: 12 59 | 106 101
98: 12 78 | 106 125
87: 106 12 | 12 109
102: 12 95 | 106 71
27: 12 84 | 106 127
69: 68 106 | 101 12
75: 3 106 | 79 12
128: 12 74 | 106 17
0: 8 11
118: 12 113 | 106 101
122: 120 106 | 51 12
109: 106 | 12
97: 106 28 | 12 125
70: 106 28 | 12 34
82: 106 40 | 12 38
123: 83 12 | 85 106
129: 61 106 | 126 12
105: 106 37 | 12 47
86: 57 12 | 18 106
35: 12 87 | 106 78
42: 106 2 | 12 88
18: 12 76 | 106 67
45: 12 101 | 106 52
59: 109 12 | 106 106
55: 12 9 | 106 33
32: 12 115 | 106 35
54: 106 28 | 12 23
21: 106 82 | 12 102
33: 12 15 | 106 10
56: 106 1 | 12 98
110: 109 68
100: 80 12 | 58 106
24: 34 12 | 78 106
63: 12 72 | 106 32
13: 113 106 | 59 12
11: 42 31
60: 28 12 | 78 106
46: 107 12 | 89 106
107: 106 81 | 12 62
112: 106 101 | 12 4
124: 106 23 | 12 52
53: 56 12 | 90 106
116: 106 23 | 12 28
125: 106 12
47: 94 106 | 26 12
67: 4 12 | 78 106
30: 28 106 | 34 12
94: 59 106 | 101 12
61: 100 106 | 27 12
10: 106 4 | 12 4
127: 14 106 | 13 12
77: 106 86 | 12 63
71: 106 124 | 12 48
117: 106 111 | 12 45
15: 43 106 | 23 12
58: 65 106 | 54 12
80: 14 106 | 124 12
73: 52 12 | 113 106
88: 77 12 | 46 106
5: 108 106 | 118 12
89: 5 12 | 122 106
99: 28 106 | 125 12
26: 106 125 | 12 52
113: 12 12
41: 50 12 | 6 106
62: 106 110 | 12 103
48: 12 43 | 106 34
50: 124 106 | 49 12
114: 91 12 | 117 106
121: 87 12
39: 106 87 | 12 23
4: 12 106
103: 106 4 | 12 52
106: "a"
119: 106 64 | 12 93
74: 41 12 | 7 106
31: 12 129 | 106 128
34: 106 106
28: 106 106 | 106 12
49: 78 12 | 28 106
93: 34 12 | 34 106
37: 97 12 | 70 106
92: 75 106 | 16 12
6: 10 12 | 20 106
22: 59 109
7: 66 106 | 123 12
95: 73 12 | 22 106
1: 12 52
23: 12 106 | 106 106
25: 69 106 | 39 12
44: 12 34 | 106 23
57: 99 12 | 54 106
65: 52 12 | 78 106
16: 106 104 | 12 22
36: 12 59 | 106 28
38: 20 12 | 60 106
83: 109 101
29: 12 105 | 106 53
91: 12 96 | 106 76
126: 106 114 | 12 19
81: 108 106 | 116 12
78: 12 12 | 106 106
14: 12 101
84: 44 106 | 104 12
64: 12 34 | 106 68
9: 106 83 | 12 67
111: 106 87 | 12 78
115: 87 109
3: 43 106 | 34 12
108: 43 106 | 28 12
51: 87 12 | 125 106
90: 106 36 | 12 121
2: 21 12 | 29 106
68: 12 106 | 106 12
40: 24 106 | 22 12
85: 12 28 | 106 87
52: 106 109 | 12 106
20: 113 106
76: 12 23 | 106 113
17: 12 92 | 106 55
19: 106 119 | 12 25
8: 42
72: 12 69 | 106 30
43: 109 109
66: 39 12 | 112 106
79: 68 12 | 59 106
96: 109 87
bbbaabaaababbaabbbabbbbbaabbabab
bbbbbbbbbaaaabbaabbaabaa
abaaabaaabaaaaaaaabbaaab
abaaaaababaaaaaababbbabb
bababaaaababbaabbbbbabaa
babaaababaababbbbaabbaabbaaabbbabbabbbaa
aabaaaaabaaababaaaabbbbbaababaaabbabbbba
babbbaaababaaabbaababbabaabbaabb
ababbabbbbabababaaaaababbaabaabb
ababbaabbbbbbabaaaabbbaabababbabbbbbbaaaaaabababbbabbbba
aaabbabababbaababbbabaab
bbaababaaaabbbaaabbabbbbabaaaaaaabaaababbbaaababbabababb
aaaababbbaaaabaabbaaabbabbabbbbbbbabbaaaaabbbaaabbbaabbbbbbaaaba
bbaaabbaabbabbabbbaabbababbbbbaabbbabaaa
aaaaaabbabbabbabbbabbbabaaababab
bababaabbbbabaabbaaaabaabaaaaabaababbbaabbbaaabaabbbbabababaaaaababbbbbb
baababaaababaaababbbabaa
ababbbabbababbabbbabbbaa
babaaaaaabaabbabaaaababbaabbabbbaabbaabbabbabbbbabbbabbbbabbbaab
bbabababbaabbababababaaabbbaaababbbbabaa
bbbaabaabaababaabababbabbaaabbbabbbababaaaabaabbaaaaaabbabbbbaba
abbabbaaabbbbbaaaabaababbabaaabbbaabbaaa
ababbaababbbabbbababbaba
abbaaaabbbbaababbbbbabbbababbaaa
bbabbabaababbbabbbaabaaa
abaababbabbbbbaaababbbba
baabbbaabbababbabaabbbab
bbbaabaaaabbbbaabbbabbbb
abababbaaaabbbbbbbbbaabababababa
aaabaabbababbbaaaaaabaabbabaaabaaaababababaabaabaaaaababbbaaaabbaabbaaab
babaabbababbabaabbabbbaa
baaaabbabaabbbaabbbaaaba
babbaababbaaabaabbbaaabbaaaaabababbababa
ababaaaaaaababbabbbabbaa
bbbbbaababaaaaabbabbabaabaabaabababaaabaabaababbbabbabbb
aaaaaaaabaababbbbaaaaaaa
abaabbabaaababaabbaabbbbaaabbbbbbabaaaaa
baababbbabbaababbbbbaabb
abaaabbaababaaabbbbaababababaaaabbbbaaaa
abbabaaabbabbaaababaabab
babaabbaaaaabaabaaabaabbbaaabaababababbbabbaaaba
abbaaaabbaaababababbbbaabbaaaaababbaaaabbaabaaab
bbaaabbbaabbbaabbaaabbba
bbbaabaaaaaababbbaaabaaa
ababbbabbbabbaabbbaabbaa
bbaababbbaaababbaaabbbaabaabbababaaaabbbbaaabbaabbababaabaabaabb
bbababbbabbbabbabbaabbbbabbabbabbbbabbbaabababbb
baaaaabbaabaaaabbbbbaaab
abbbbaabbbabbbabbaaabaab
baabbaabbbaababaababbabbbabbabbb
bbbbababbbbbbaaaabbbbaabaabaabbaaabbbaaa
aabbbabbbbbaabaaabbbbaabaababbaaabbbaaab
aaabbbbbbabbaabbbbaaaabb
baababbbbabbbaababbaaaba
abbbbbaabbabbabababaaabaaabbaabb
bbbaabbbbaaaaabbbbbaabaabaababbbaabbabab
baabbaaabbbaabbabbbabbab
baabababbabbaabaaaaababbabaababa
babbabaababbbaabababaaba
abbbabbaaaaabbbbaabbaababbaaabaabbaabbbaabaabaaa
ababbbabaababbaababbbaabababbbababaabbabaaaabbba
abbbbaaaabbaabbbbaababbbabbbababbbbbbbaabbabaaabbbbaabaa
bbaaabbabbbabababbbaabba
bbbaaabbbabbaabbbbbaaabb
babbabaaabbabbababbbaaab
bbabbabbbbaaaaabbabaabbaaabbbbab
abababbabbbbabbbbabaabbb
aababbaabbaaabbbaaaaaaba
abbbbabbbabbbaaabaaabbbb
aaabaababbaaabaabaabababaababbbbbbabaaab
aaabbabaaaabbbaababaabaaabbbaabbbbbaaaaa
abbbabbabbbbbaababbabbababbbbabbbaaaaaabbbbabbbbbaabbaaaabbbbbbb
bbbbbaabbbababbabaaaaabbaabaaabb
baaaaaabaabbbaaaaabbbbab
bbaaabbababaabaaabaaabababaaaabb
abbaaaaaaaaaabbbaaaaababaaaabbbaabbababb
babaabababbabbbbabbabbabbabaabbbababbbbaabbbbabbbaaababb
aaabaaaabbaabbbbaabaaaba
bbbbbbbbbabaaaaaabababab
abbbbaaaaaababbaababbbababbaabbbabbaabaa
aabbaabaabaaabbabbabbabbaaabbaabbaaaabab
bbabababababbaabbaaabaaa
aabaababaaaaaabbbababbaa
abaabaabbaabbbaaabaabaabbabbbaaabababbababbbbbbbaabbabbb
aabbabaaabbbbaabbaabbabb
abbaaaaabbababbbabbabbbbbbbaababbabbbbabbaaabbabbbbbaaab
abbaababbabbbbaaaabaabaa
bbaaaaabbaababaabaabababbbbbababbaaabbaa
aaabbbaabbabbaababaaaabb
abbabaaabababaaaaaaaaaba
aaabbabaabbabaabbbbbaaab
abbbbabbbbababbaababaabb
bbbabababaaabababbbbbaabbababaabaaaaaaba
bbababbaaaababaaabbbabab
aabbaabaaaabaaaabaabbabaabaaaabb
abaaabbaabbbbbaabbbbbabb
aabbabaababbabaabbaabbabbaababaabbababbaaabbaabbaabbbbab
bbaabbabbabaaaaababbbabb
aababbbaabaabbabbbabbaabababbaaabbbbbbabbaababbabbaabababbabbbabbbbbaaaa
abaaababbaabababaabaabbabbbbaabababbabbaabaabbba
aaabbaabbabbaaabbababaab
babbbbaaabbbbbabbbbabbba
aaaaababaaaaaabbaaabaabb
babaabaababaaabbabaaaaaaabbaaaabbbababaabaabbbab
aabaaaabaaababbabbbaabbb
aaabbabbabbabbbbaaabaaaabbbabaabbaaabaabbabaaabaabaaabbb
abbabbbbabbabbbbabbaaaabbabbabba
aaabbaabaaababbbababbaaabaabababbababbabaaaabaaaabbbabaa
babbaaabbbaabbbbbabbbbab
bababaaaabbaaabbaaabbbabbabababbaaabababbbbabbbaabaababa
aaababaaabbaabbbabbaabbaabbaaaaabbbababaabbaaabb
baabbabbabaababaabbbabbaabaaabaabaabaabbbaabaaba
aaaababbbbbaabababbbaabaabbabaaababaabaaabbbaaaa
ababaaaababbabaaaaabbbbbaaababaaabababab
abaaababbbbbabbbabbbbabbaaaabaabbaaabaab
aaabbabababbaababaabbbba
bbbbbababaaababaabbaaaababbaabbaaabaaaaababbabba
babaaababbbbbaaabbabbaabbbabbabbbbbaababbabbbababbbbbbbabbbaaababababbaa
abbbbbababbbabbbbbbabababaaababbbbabaaaabaabaaaa
babbaabbbabaaababbbababaabbaaaabbbaabbabaabbabaaaabaaabbaabbaaabbbbaaaba
baaaabbaaabaaaabaaaaabaababaabbabbbbbbab
ababbbabbbabbbbbabbaaaaabbbaaabaabbbbbbb
aababbaabaaaabbabbaabbbbaabaaaabaaabbabaaabaabbaaabababb
aababbaaaaabbbaaaabaaaabbbaababbbbaababaababababbaaabbbbabbbaabb
aabaaaaaaabbbbbbaabaaaaa
ababbbbbaaaaaaababaaaaaabbaaabbbabababaabaabaaaaaabbaabb
bbaaabbbbbbbbbbaaaaabbaa
aaabaababaaababbbbbbbaabaababbaaaabbabbbaabababa
bbabbaaaabaaaabaabbababb
baaaabbbbaaabababaaababbaabbaaabaaabbbba
baaaabbbabbaabbbbbbbbaaabababbbb
bbbbbaaabaabbbaababbbbba
baaaabbaababaaabababbaaa
baababbaabbabaabbbbbaaab
baaaabbabbabbaaaaaabbaababaababbababbbba
abbbabbbabaabaabaaaaaabbbabaabaaababaaabbabbaaaabaaabbbb
abbbbbaaabbabaabaabbbaba
bbbbababbabbaaabbbaababbababaaabbaaababa
baabbaabbbabbbabbbabbbababaaaabababbabab
babaaaaababbaaabbbbbabaa
baababaabbabbababababaaaabaaababaaabbaaa
abbaababaabbaabaaababaaa
bbaaabaaabbbbabbabaaaabaabbbbbaabbaaaaba
babaaaaabbaabbababbbabbbaaababbaaabaaabb
babbbaaaabbabbababbaabbabbabaaba
babbbaabbbaababbbaaabbab
aaabbbbbbbbaaabbabababbaababbababababbaa
ababaaaababbbaabbaabbbbbbaaaabab
baababbaabbbbaaabaaabbbb
aaabaabaaaabbbbbabbabaaaaaabbababaabaabaaaabbabaaabaabaaababaaba
bbabbabbaabbabaabbbbaabb
babbaaabaabbbbaaabbbabbaaaababab
aabbabaabbabbbabbbbabaab
aabaaaaaaabaabaaaababbabbbaaaabbaabaababbbbaaabaabababbb
babaabbabbbababaaaaabbbbbbbabbba
bbbaaabbbbabbbbbbaabaaaa
aaabaabaaabbbbbabbbabbab
abbaabababbaaaaabbbaababbabbbbaabaaabababbbbabbaaaabbbbaababbbbabaaaabab
ababaaaabababbbababaaaab
abbbbbababbaabaaaaabbaaabbbabbbaaaabbbabaabababa
bbbbbaabbbbaababbbbbabaa
ababbbaaabbbaabbbaabbbbbbabbbbbbbaaabbabbabaabbaabaabbaa
baaaabaaabbbbabaababbbaa
bbababbaaaaaababbbaabbabbbaaabbabbbaabba
aaaababbabbbbbababaabbaa
bbbaaaabbbbbabbabbbbbababaaabbaabaabbabb
abbbbabaaaababaaaaaabaab
bbaabbabaabbbaababbabaabaabbbbaababbbaabaaabaabaaaababbb
bbbbbaabaababbaabbbbbaabbbbababb
abaaabbabababbbabbbbaaaaabbaabaabaabbaaaaaabbaba
abbaabbababbaabaabaaabbb
aaabbabbabbabaabaaababbb
bbbbababaababbaabbbbaaab
baababaaaaaaaaabbabaaabababbbaabbabbbaba
aaabbababaaababbbbbbababbabaabaabaababaababaaaab
baaaaaababbbabaabaaaaaaaababaabaaabaabaaabbababa
bababbabbbabbabaabbbbaabaabbabab
aaaaabbbaabbbbbaabbbaaab
baaababbaaaaaabbaaaabbbbbbaaabbababbbabb
baaaaabbaaaaaaaaaababaaa
aaabaaaaaabbbabbbababbabaabbbabbaabbabbbbbabaaab
babaaabaaaabbabbaaabbaababababbbbbaabbaa
babbbabaaabbbababaaaaaaa
abbbbaabaababbaaabbbbbaaababbbbbbbbaaaba
aabaaaabaabaababaabbbabbbababaaaaaabbaaa
bbabbbbbabbaaaaabbaaabbabbabaabb
abbabaaababbbaabbbabbbba
abababbaabbbabbbbbabbababaaaabbbbaaabbab
bbabbbababbaaaabbbababbbbaaababbbbabbbaa
bbaabbbbaaabaaaabbababbabbbbbbbbaaaababa
bbabababbbaaabbbababaaabaaaaabbbaaaaaabbabbbbbabaaabaaabbaaabbba
abbbaabababaaaaaaaababaaaaaabbbbbbabbbbbabbbbbbbbaabbaaaaabbbbab
bbbaaaabaaaaabbbbbbbaaab
bababbabbbaaabaaabaababbbaababbabaaaabaabbbbaabb
aaaabbbbbaaaaaabababbbba
aababbaaabbaababababbbabaababbaaabbbaabbaabbabbb
baaaababbbabbaaaaababaab
babbbaaabbaababbabbababa
aabbaaaaababaababbaaaabb
babbabaabbabbabaabbbbaaababbaaaa
abaaaabaabbaaaaaaabbabab
bbaabbbbaaababbaabbabbbbaabbbaabbaaaaaabbabababa
bbaaaaaaabaababbbabababa
baaaabbbaaabbbbbbbabbbba
bbaaaaabaababbaabbbbbbbbbabbaababbbbbbba
baabbbaabbaaaaabaabaababbabaaaaaaaaabbabbbbbabaa
babaabaaabbbbbbbaaaaabbabbbbaaaababaabaabbbbbbabaaaabbaabbbbbbaabaabaaab
babbbaabbbbaabaaaaababaaaaabbaabbbabaaba
bbababbbaaabbbbbbbaaaabb
ababbbbbaaababaaaabbbaaa
ababbaabbbabbbbbaaabaaab
abbabaaaaaabbabbabbaababaabbabba
abbaaaaabbaabbbbaaaaababbbbbbaabbbbabbbaaaabbbab
baaaaabbabbbabbbabbbbaabbabbabaabbaaaaababbaaabbabbbbbbb
bbaaabbbbaaaaababbbaabba
aaabaaaaaabbbbbabaabbbaabaabaababaabaabb
aabaababbaaaabaaaaabaaaababaaabbbabbabab
aaabbaababbbbbababbabbbbbbbbabaa
bbababbbbaababbababbbaaabaabbabb
bbaabbbbbabbaabbbaaabbab
abbbbabbaaabbbaaaaaaabaaabbbabbbabbaababbababbaaaababbbaabaaaabb
abbbbabaaabbabaaaaabaabaabbbbabbbabababababbabba
abbbabbbababaaaaaabababb
baaaaaabbabbabaaabababab
aabbbaababbbbaabaabbabba
aabaaaababaaababbbababaa
ababbbbbaababbabbbaaabab
abbabbaaababbaababbbaaab
aaaabaabaabaabbbbbbabbaa
bbaabbabbaabbbbbababbbba
aaaaabbbaaaaaabbbbaaabbabbbaabaaaabbabbb
abbabbabababbabbbaabbbab
bbaaabbbaaaaabbbaabbabaaaabaabbb
baababbabaaabbbabbbabbba
aabaaabbbbabaaabbaabbabbbbaaababaabababb
bbaaaaaaababbabbbbbabbba
bbaababaabbbbaabbbbabbab
bbabababbbabbaaababbbbaaabaabbabaababbaabbbbaabbbbabaaaa
abbbbbaabbbbbabaaabbabbabaabbbbabbabaaaababaaabbbbaabbabbbbbbabbbbbaabbb
aaababaababbaabaabbaababbaaaaababbabaabaaabababb
bbaaabaaaaaabbbbbbbbaaaaabbbbbaabbbbabbabbabaaabbaaabbaababbbbbb
abbbaababbbaababbabababa
aaaaaaabbaaaabbababbbaaababaaabbabbbabaabbbaabbaababbbba
bbbbaaaaabbbbababababbabbabbabbb
abaababbabbabaaabbbbaaab
baaaaaabbabbabaababbaababababbbb
bbbaaaabababaaaaaabbabab
aaabbaabbaaaaababbaaabbaabaababbaaaaaaabbaaaabbbbbaabbba
baabababaababbabaabbbbab
abbbaababbbaaaabaaabbbbbaaaabbaababababbbbaaaababbbbbabb
aabaabbabaaababbbabbabab
aaababbaaaabbaabaabaabbb
aaababbaaaaaabaaabbaaaaabbbabbab
abbbbbababaabaabbababbbb
aaaabbbbbbababbabbaaabaaaabbbaaa
bbabbaababbaaaaabbabbbbbabbaaabaaaaaaaba
bbababbaaaaaababaaabbbbbbbabbbabbbaabaaa
abababbaaabbbaabbabbbaaabbaabababbaababb
bbabaabaaaabababbbbaabaaabbbabbbbbaabbaaabbbbabaabbbbaaa
baaaaabbbaaaabbabbbbabababaabaabababbabaaaabbbba
bbbbababbbabbaaaaaaabbbbbaababbabaaabbba
ababbabbbabaaaaaabaaaaaabbbbbbba
aaaaabababaaaaaaabbbbabbabaaabaabaaaaaba
aabbbaababbabaababbbabaa
abaabbabaabbaabababaabaabbbbabababbababbabaabbaa
bbbbbbbbbabaabaaaaabaababaababbbababaaaabbbbbbbaabbaaabaaababbbbbabaabbb
abbabbbbabbbabbaaaabaaab
bbbbbbaabaabababbaaaabbbbaaabbaa
ababbbababbbbbaabbaababababbbbba
bababbbabaabbaabbbbbaaab
baabbaabaaaaabaaabababab
abbabbbbaaabbabbaaabbaabbbbbbbbbbaabaabababbabaabbbbaaab
babbaaabbbabbbbbbbbbbbbbaababaab
babbbbaababaaabaababbbba
aaaaabaaabbbbaaabbabbbabaababbbbbaaabaaa
abababbabaabaabaabbabbba
aaaaaabbaababbaaaaaaababbbaabbabaaabbbbaabaaabbbbbbaaaba
ababbbbbabbabbbbabaabbabbabaaabbabaabbabaaababbb
bbaaaaabaabaababaaabaabaabbbbabbbaabbaaa
baaabababbaaabbaaabbbbab
baaaabaabaaaabaaaaaaabababababbabbbbaabaaaabbaabaabaabbbbaabbaaa
aababbabaabbbabbbbbabaab
baabbaabbaaaaabaabaababa
baaababbaaabbabbabbbaabb
baabbbaabbbbaaaaaaabaaab
bbabababbabbbaaaaabaaaba
abbabaababbaabbbaabbaaab
babbaabbaaabbababbababaa
bbabbababbababbbaaabaabb
bababbbaaaabaababaaaabbaabaabbbb
bbbbababbabaaabaabbbbaaabbbaabaaababaaaaabbaaabbbabbbbabaaaababa
ababbaabababbbababbabbbbbbaaabaabbabbbba
aaabaabaaabbaababbbbabbabbbbbbab
babaaaaaababbabbbbbbaaab
bbbbbababbaabbabbaaabaaa
bbababbaabbbbbaabbabbaababbaaaaabbbabaaa
bbabbababbababbbbabbbabb
aaaaababbbbaaabbbababbbaaaabbbaabbbbabbbaaaababaabbbbbbbaaaabaababbbabaa
bbbbaabaababaaabbaaaaaaa
abbabaaaabbbbbaabaabaaab
bbbaaaabbaaababbbaaaaaaa
babbabaabababbabbbaababbabbbaaab
abababbababaaabbaabaabaa
bbabbababbbbbbbbabbaabaa
bbbbaababbbbabbbabbbbbba
aaabbabaabaaabbaababbabbababbbbbaababbba
bbaababbabbbbaabaaabbabbabbaaaaabbaabbbaabbbbbbb
aaaababbbbbbbabaaaababaaabbabbbbabaabaaa
bbababbbababaaabaabbabab
aabaaaabaabbabaabaaabaab
bbaaaaaaaaaababbabaaaabb
aaabbabbbbbbaabaabaabbbb
aaaaabbbabbbbbabaabaaaba
abbbabbbbbbababababbbaaaabbabbbbbabaabbb
abbaaaabbbabbabaababbaaa
abbaababaaabbbbbbabaaabaabbbbbaaabbbaaaaaabababbbababbbbaaaabbabaabaabaa
bbabbababbaabbababbabbabbbbbababaabbbaba
bbabbbababbaaaabaabaababbabababbababbbba
ababbbbbbbabbabbbabbabba
aaabaaababbaababaabaaaaabababaaabaabaabaaababaaaaababbbaabbabaabbbbbabaabaabbbabbababaababaabbaa
aaaaababbabbabaabbbbbabb
aababbaababaaabaaabbabab
bbaaaaabbbababababaababa
aabaaaabaaababaabbaabbba
ababbbbbabaabaabbaabbaabbabbbbab
abbbbabbababbabbabaaaabaaabaabaabaaabbba
abbaaaababbbbaaaabbaabbbaabaaaba
abbbabbabbbbbaabbbabbbbbaaaababa
ababbabbbaaaaabaababaaba
abbaaaaabbbbaabaaabaabaa
bbbaaabbbabbbbaaabbaaaaabaaabbbb
aaaaabababbaabababbababa
aabaababbababbbabbabaabbbbbbbababababaababbaabaaaaaabbbababbabaaaabbabbaaababbabbabbbaaabababaab
aaaaababbbbbabbbbbaabbbbbbaaaababaaaabab
bbaabababbaaaaaababbabbb
bbbaaabbabbbbaaabaaabbba
bbbbbaaabaabbabaabbbbaaaabaabbaabbaaaabb
abbbbbabbaaaabbbbabaaabbaaaaaabbabaaaaababbaaabb
bababbabaababbaaabaababbabaabaaa
bbbbabbbbbaababbbbaaaaabbabbaabbbbababbbaaabaaaaaabbabbb
bababbabababbbabbabbaaabbbaaabbbababaaaabababbabbbabaabb
abaabbabbbbbbaabbaaaabbbabbbbaabbabaaabbbaabbabbbabbbbbbbaaabaaa
baaabababbbaaaabbababbabbabbabaaabbbaaab
bbbaabaabbabbabbaabaaaaa
abaabbabbbababbaaaaabbaa
aabbbbbaabbbabbbaaabaabb
babaaababaabababaabbabba
bbbbabbbbaabbabaaaabbaabbbbaaaabbaaaaaabbaabbaaaaaabbaaabbbbaabbbaaaabab
bbaababaabbbabbbbaaabaab
abaababbbabbaabbbabababa
ababbbababaaaaabbbabaaaa
bbbbbbbbabbbbaababbabbaaaabbbbbabababbbaabbbaaaa
abbabbbbbabbbaaabbbbbbbbaabaabaa
abbabbbbaabbaababaabbababbaababbbaabababaabbbabaaaaabbaa
bbabbbbbbabbbbaabaabbabb
abaaaabaaabbaabaabababaa
aaaaabbbbaaababbbbaabaaa
abbabaaabbaaabbbbababaab
ababbabbbbabababbaabbbba
aaababaabbabbababbbabbaa
bbbbaabaaaabbababbbabbbb
babbaaabbbbbababaaaababa
baababbabaaaabbaabbbbabaaabaabbb
bababbaaabbbbabbbbbaaaaabababaaabbabbaaababbbbbbaababbaabbbbabaaabaabaaabbaaabbaabaababa
bbabbabaaabaabbaaabbbbab
aabbaabaabbabaaaaaaabbaaabbbabaaabbbaaab
abaabbabababaaaababababa
baaaaaaaabaaabbbabbbbaaabbbabaabaaaabaaa
aabaababbbbbbbaaaaaabbab
abbbbbabaaaaaaaabaaabababbbabbbaabbbaaaa
bbbbbaababbbbabbaabbabba
abbabaababaabaabaababaaa
aaababaaabbbaababbabababbbbbaaababaabaaa
aaaaaaaaaabbabaaaababaaa
aaabbabbbabaaabbbbababaa
baaaaabbbbbbbbbbababbbbbaabbaaab
baaaaaabaabbabaabbbbbaabbbababbbbbbbaaab
bbbbbbabaaaaabbbabbaabbbbbabbbbbbabbbbbababbbaabbbbabbaa
babbaabaaaaabaabbabaabbbbbbaaaaaaaababab
bbaababbabbaababbbabbabaababbaaabbbabbaa
aaababaaababbaabaaaaabba
bbbbbbbbaaaababbbbaabaaa
bbababbabbbbbbaaaabaabbb
bbbaaabbaaabbaabbaaaaaaa
aaababbaaaabbababbabbbbbbaabbaabbbbbaaab
babbaababaababbbbbbbaaaabbaaabaabbaabbba
bbbaababbaaaabbbbababaab
bbaababbbbaabbbbbbaabbaa
babaaaaaabbabaaaabbabaabbbbbbabbaabbbbab
baabbbbbabbbbabaaaababbb
baabbabaabbaabbbbabbabbb
abbaabbbaaababbaabbbbbabbbaabbababababbabbbbbbabbabaababaabbbbbb
aaaabbbbaabbbaabbaaaaabbabbbbaaababaaaaaabbbaabb
baababbbbbaababaabbabbaabbbbababbabbaabaaaaababbbaabbbbaabababaa
baabababaabbbbaabbabbbaa
aaaaaaabbaaababbaaaabaab
aabaababaaabaaaabbbbbbaaaaaabaaa
baabbaabaaaababbbbaaaabb
abbabbbbaaabbaababbbabab
aaabbababbabababaabbabab
babaabaaaaaaabaabbaababbaabbbbbaaabbbbaaabbababbbabaabbbbbabaabbbbababaa
bbbbabbbaabbbbbabaabaabb
aaabbbaaaaabbabababbbaabbababaaaabaabbaa
baaaaababababbbabaabaababaaabbab
aaaaaaababbbabbababaaabbaaaababaabbbbbba
abbbaabaabaaabbaaabbaabb
aabbaabababaabaabbaabbaa
bbababbbabababbabbaabbaa
bbbbbababbabbaababbbbabaaaaaabbbaabababaaaabaaab
baaababbababbaabbbaabaab
baabaababaabbabaaabbaaaaabaaaabb
abbabbbbababbaabbbababaa
bbbbaabababaaabbaababbaababbaaabbbaaabab
aabaababbaababaabaaaabbbabbaaabb
babbbaaababbaaabbababbbababbbbab
bbabbbababaaabaaababbabbbbaaaaaababbbbbb
aaaaaaababbabbbbabaaababbaabababbbbaaaba
abababbabaababaabbababaa
baaaabbbbbabbaabbabaaabababaaabbabaababbabaabbba
bbbbabbbbbaabbbbbbaaaabb
bbababbbabaabaababbaaabb
bbaaabaababaaabababbabab
baaaaabbaaaababbaababbbb
aaaabbbbabbbbaaababbbbbb
abbbbbaaabbabbaabbbbbaaaababbbbaaababbba
abbbbaaababaabaaabaabbbb
abaabaabbaabbaabaaabbabaaabbabba
ababaaababbbbabbaaababaabaabbbaaaabbaaaa
babbbbaaabaaababababbbabaaaaabba
bbabbbababbaabbbaaaabbbbabbaaaaaabaabbaababbbbbb
aabbaabbbaababbaabbabbbbabaabaaaabbaaababaaaabbb
bbbbbbaaabaaaaaaaaaaabba
abaaabaaabbaabbbababaaaaaabbbbab
bbaaabbbbaabababbbbababababaabaaabaaaababbaaabba
baababaabbbaaabbaaabbabbaaaaaaaaaaabaaaaaabbabab
bbaabbbbbabbabaabaabaabb
bbbaababaaaaaaaababbbaabaababbbbbaaaabab
baabbabaabbbabbabaabaabaababbbabbaabbbaabbababbbbabbbababbbbbabbbbabaaaa
baabbbbbabbaababbbbaaaabaababbaabbbbabbbabaaabaaaaabababbabbbbabababaabbbaabaaab
abaaabababbbbababaabbbaaaababaaaaabaabaa
bababababbbabbaaabbaaabb
baaaaabbabbbbaabaabaaaba
aaaaababbbaabbbbbababaaaaaababbabbaaaabbbbbabbaa
bababaaaaaaaababababbbba
bbaaabbaaaaaaaaaaababaaa
babbaabbabbbabbbbbbbabbbabbabbbb
babbbaaaaaaaaaaabbaabaab
abbabbaabbabbababbbbaaaaabbaaaba
abbabbababbaaaaabbaaabbaabbaabbabbbbaaab
aaababbababaaabbbaaaabab
aaaaaaabababbabbabbaabbbaabbbbbb
abbbaabaababaaaaaaaabbaa
abaaabbabbbbaaaabbbababb
bbbbbaababbbbabbbabaaaaabbbbbbaaabbabaababaabaaabbaaaababaabbbba
baabbbbbabbbbaaabbabbbabbaabababbbbbbabbbabbabba
aaaaabbbbabbabaaaaababbb
babbbbaabbbbbaabbbabbbbbabbbbbaabbbbbbaaaabbaaaa
abbabaaaaaababaabbabbbabaabbbbbaabbbabbbbabbbbba
abbaabbbbbabbaaaaabbbabbaabbabaaaababbbaaababaab

View file

@ -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