1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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
}
|