diff options
author | Irene Knapp <ireneista@gmail.com> | 2020-12-02 21:33:54 -0800 |
---|---|---|
committer | Irene Knapp <ireneista@gmail.com> | 2020-12-02 21:33:54 -0800 |
commit | d88a896b5fa0edf12bca751f5e5a285ffbb1e9d7 (patch) | |
tree | fa32e284615615e738a6c0ec8f033ec80648e4ce /03/src | |
parent | 217a60c017cf54226653321c8cb5a0f844b2101d (diff) |
Day 3
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 +} + |