1use utils::array::ArrayVec;
2use utils::prelude::*;
3
4#[derive(Clone, Debug)]
6pub struct Day12 {
7 part1: u32,
8 part2: u32,
9}
10
11impl Day12 {
12 pub fn new(input: &str, _: InputType) -> Result<Self, InputError> {
13 let programs = parser::u32()
14 .repeat_arrayvec(", ", 1)
15 .with_prefix(parser::take_while1(u8::is_ascii_digit).with_suffix(" <-> "))
16 .parse_lines(input)?;
17
18 let mut groups = Vec::new();
19 let mut visited = vec![false; programs.len()];
20 for i in 0..programs.len() {
21 if !visited[i] {
22 groups.push(Self::connect(&programs, &mut visited, i));
23 }
24 }
25
26 Ok(Self {
27 part1: groups[0],
28 part2: groups.len() as u32,
29 })
30 }
31
32 fn connect(programs: &[ArrayVec<u32, 8>], visited: &mut [bool], program: usize) -> u32 {
33 visited[program] = true;
34
35 let mut group_len = 1;
36 for &connected in &programs[program] {
37 if !visited[connected as usize] {
38 group_len += Self::connect(programs, visited, connected as usize);
39 }
40 }
41
42 group_len
43 }
44
45 #[must_use]
46 pub fn part1(&self) -> u32 {
47 self.part1
48 }
49
50 #[must_use]
51 pub fn part2(&self) -> u32 {
52 self.part2
53 }
54}
55
56examples!(Day12 -> (u32, u32) [
57 {file: "day12_example0.txt", part1: 6, part2: 2},
58]);