advent_of_code/year2016/
day03.rs1use 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}