diff options
Diffstat (limited to '03/src')
-rw-r--r-- | 03/src/main.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/03/src/main.rs b/03/src/main.rs new file mode 100644 index 0000000..b8621da --- /dev/null +++ b/03/src/main.rs @@ -0,0 +1,67 @@ +use advent_lib::prelude::*; + + +fn main() -> Result<()> { + let mut args = std::env::args(); + if args.len() != 2 { + eprintln!("Usage: advent input"); + } + let _ = args.next(); + let filename = args.next().unwrap(); + + let input = advent_lib::read_lines_file(&filename)?; + + let mut trees: Vec<Vec<bool>> = Vec::new(); + + for line in &input { + let mut tree_line: Vec<bool> = Vec::new(); + + for c in line.trim().chars() { + if c == '#' { + tree_line.push(true); + } else { + tree_line.push(false); + } + } + + trees.push(tree_line); + } + + let mut product = 1; + product *= check_slope(&trees, 1, 1); + product *= check_slope(&trees, 3, 1); + product *= check_slope(&trees, 5, 1); + product *= check_slope(&trees, 7, 1); + product *= check_slope(&trees, 1, 2); + + println!("product: {}", product); + + Ok(()) +} + + +fn check_slope(trees: &Vec<Vec<bool>>, dx: usize, dy: usize) -> usize { + let mut x = 0; + let mut y = 0; + let mut trees_hit = 0; + loop { + let x_adjusted = x % trees[y].len(); + let is_tree = trees[y][x_adjusted]; + + if is_tree { + trees_hit += 1; + } + + x += dx; + y += dy; + + if y >= trees.len() { + break; + } + } + + println!("dx: {}, dy: {}, trees: {}", dx, dy, trees_hit); + + trees_hit +} + |