summary refs log tree commit diff
path: root/03/src/main.rs
blob: b8621dacc2d25030138936b205beecf88ad4e8c6 (plain)
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
}