1pub fn parse(input: &str) -> Vec<&[u8]> {
6 input.lines().map(str::as_bytes).collect()
7}
8
9pub fn part1(input: &[&[u8]]) -> usize {
10 input
11 .iter()
12 .filter(|&&line| {
13 let mut has_abba = false;
14 let mut inside_brackets = false;
15
16 for [w, x, y, z] in line.array_windows() {
17 if w.is_ascii_lowercase() {
18 if w == z && x == y && w != x {
19 if inside_brackets {
20 return false;
21 }
22 has_abba = true;
23 }
24 } else {
25 inside_brackets = *w == b'[';
26 }
27 }
28
29 has_abba
30 })
31 .count()
32}
33
34pub fn part2(input: &[&[u8]]) -> usize {
35 let mut aba = [usize::MAX; 676];
36 let mut bab = [usize::MAX; 676];
37
38 input
39 .iter()
40 .enumerate()
41 .filter(|&(version, &line)| {
42 let mut inside_brackets = false;
43
44 for [x, y, z] in line.array_windows() {
45 if x.is_ascii_lowercase() {
46 if x == z && x != y && y.is_ascii_lowercase() {
47 let first = (x - b'a') as usize;
48 let second = (y - b'a') as usize;
49
50 if inside_brackets {
51 let index = 26 * second + first;
53 bab[index] = version;
54 if aba[index] == version {
55 return true;
56 }
57 } else {
58 let index = 26 * first + second;
59 aba[index] = version;
60 if bab[index] == version {
61 return true;
62 }
63 }
64 }
65 } else {
66 inside_brackets = *x == b'[';
67 }
68 }
69
70 false
71 })
72 .count()
73}