Skip to main content

advent_of_code/year2016/
day03.rs

1use crate::input::Input;
2
3pub fn solve(input: &Input) -> Result<u32, String> {
4    fn is_triangle_possible(n1: u16, n2: u16, n3: u16) -> bool {
5        let n1 = u32::from(n1);
6        let n2 = u32::from(n2);
7        let n3 = u32::from(n3);
8        n1 + n2 > n3 && n1 + n3 > n2 && n2 + n3 > n1
9    }
10
11    let mut possible_triangles = 0;
12
13    let mut v1 = Vec::new();
14    let mut v2 = Vec::new();
15    let mut v3 = Vec::new();
16
17    for (line_idx, line) in input.text.lines().enumerate() {
18        let on_error = || format!("Line {}: Invalid input", line_idx + 1);
19
20        let mut parts = line.split_ascii_whitespace();
21        let n1 = parts
22            .next()
23            .ok_or_else(on_error)?
24            .parse::<u16>()
25            .map_err(|_| on_error())?;
26        let n2 = parts
27            .next()
28            .ok_or_else(on_error)?
29            .parse::<u16>()
30            .map_err(|_| on_error())?;
31        let n3 = parts
32            .next()
33            .ok_or_else(on_error)?
34            .parse::<u16>()
35            .map_err(|_| on_error())?;
36
37        if input.is_part_one() {
38            if is_triangle_possible(n1, n2, n3) {
39                possible_triangles += 1;
40            }
41        } else {
42            v1.push(n1);
43            v2.push(n2);
44            v3.push(n3);
45            if v1.len() == 3 {
46                if is_triangle_possible(v1[0], v1[1], v1[2]) {
47                    possible_triangles += 1;
48                }
49                if is_triangle_possible(v2[0], v2[1], v2[2]) {
50                    possible_triangles += 1;
51                }
52                if is_triangle_possible(v3[0], v3[1], v3[2]) {
53                    possible_triangles += 1;
54                }
55                v1.clear();
56                v2.clear();
57                v3.clear();
58            }
59        }
60    }
61    Ok(possible_triangles)
62}
63
64#[test]
65pub fn tests() {
66    let real_input = include_str!("day03_input.txt");
67    test_part_one!(real_input => 1050);
68    test_part_two!(real_input => 1921);
69}