diff options
Diffstat (limited to 'd03/src')
-rw-r--r-- | d03/src/main.rs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/d03/src/main.rs b/d03/src/main.rs new file mode 100644 index 0000000..d168a44 --- /dev/null +++ b/d03/src/main.rs @@ -0,0 +1,89 @@ +use std::fs; + +fn solve_part1(rows: &Vec<Vec<usize>>) -> usize { + let mut num_valid: usize = 0; + + for row in rows { + let mut sides = row.clone(); + + sides.sort(); + if sides[0] + sides[1] > sides[2] { + num_valid += 1; + } + } + + num_valid +} + +fn solve_part2(rows: &Vec<Vec<usize>>) -> usize { + let mut num_valid: usize = 0; + + // For each 3 consecutive rows of data + for i in 0..(rows.len() / 3) { + // For each of the 3 numbers per row + for j in 0..3 { + let mut sides = Vec::new(); + // For each row in this group of 3 rows + for k in 0..3 { + sides.push(rows[3 * i + k][j]); + } + + sides.sort(); + if sides[0] + sides[1] > sides[2] { + num_valid += 1; + } + } + } + + num_valid +} + +fn main() { + // Read and parse triangle data from input text file + let input = fs::read_to_string("input.txt").unwrap(); + let lines: Vec<&str> = input.lines().collect(); + let words: Vec<Vec<&str>> = lines + .into_iter() + .map(|l| l.split_ascii_whitespace().collect()) + .collect(); + let rows: Vec<Vec<usize>> = words + .into_iter() + .map(|w123| w123 + .into_iter() + .map(|s| s.parse().unwrap()) + .collect()) + .collect(); + + // Part 1 gives 993 for me + println!("Part 1 solution: {}", solve_part1(&rows)); + + // Part 2 gives 1849 for me + println!("Part 2 solution: {}", solve_part2(&rows)); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_example1() { + let rows = vec![ + vec![5, 10, 25], + vec![3, 4, 5], + ]; + assert_eq!(solve_part1(&rows), 1); + } + + #[test] + fn part2_example1() { + let rows = vec![ + vec![101, 301, 501], + vec![102, 302, 502], + vec![103, 303, 503], + vec![201, 401, 601], + vec![202, 402, 602], + vec![203, 403, 603], + ]; + assert_eq!(solve_part2(&rows), 6); + } +} |