Skip to main content

advent_of_code/year2017/
day12.rs

1use crate::input::Input;
2use crate::year2017::disjoint_set::DisjointSet;
3
4pub fn solve(input: &Input) -> Result<usize, String> {
5    let num_programs = input.text.lines().count();
6    let mut program_groups = DisjointSet::<8196>::new(num_programs);
7
8    for (line_index, line) in input.text.lines().enumerate() {
9        let error_message = || {
10            format!(
11                "Invalid input at line {}: Expected 'ID <-> ID[, ID]'",
12                line_index + 1
13            )
14        };
15        let parts = line.split(" <-> ").collect::<Vec<_>>();
16        if parts.len() != 2 {
17            return Err(error_message());
18        }
19        let first = parts[0].parse::<usize>().map_err(|_| error_message())?;
20        for other_str in parts[1].split(", ") {
21            let other = other_str.parse::<usize>().map_err(|_| error_message())?;
22            program_groups.join(first, other);
23        }
24    }
25
26    Ok(if input.is_part_one() {
27        program_groups.size(0)
28    } else {
29        program_groups.num_groups()
30    })
31}
32
33#[test]
34fn tests() {
35    test_part_one!(
36            "0 <-> 2
371 <-> 1
382 <-> 0, 3, 4
393 <-> 2, 4
404 <-> 2, 3, 6
415 <-> 6
426 <-> 4, 5"
43        => 6
44    );
45
46    let real_input = include_str!("day12_input.txt");
47    test_part_one!(real_input => 152);
48    test_part_two!(real_input => 186);
49}