aboutsummaryrefslogtreecommitdiff
path: root/src/2020/day3/aoc.cpp
blob: 1315e2bcafc394c9df43f8b02726bc6be068222c (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
#include "aoc.h"
#include <vector>

namespace aoc2020 {

struct pos {
  int x;
  int y;
};

pos mov(pos p, int dx, int dy) { return {p.x + dx, p.y + dy}; }

void progress(pos p, pos* d1, pos* d2, int dx, const std::vector<line_view>& trees, int* count) {
  pos* d = dx > 0 ? d2 : d1;
  pos n = mov(p, d->x, d->y);
  if (size_t(n.y) < trees.size()) {
    const line_view& row = trees[n.y];
    if (size_t(n.x) < row.length) {
      const char* t = row.line + n.x;
      if (*t == '#') {
        *count += 1;
      }
      progress(n, d1, d2, 0, trees, count);
    } else {
      d2->x = n.x - row.length;
      d2->y = d1->y;
      // printf("delta %d %d\n", d2->x, d2->y);
      progress({0, p.y}, d1, d2, 1, trees, count);
    }
  }
}

std::pair<int, size_t> day3(line_view file) {
  std::vector<line_view> trees;
  per_line(file, [&trees](line_view lv) {
    trees.push_back({lv.line, lv.line + lv.length - 1});
    return true;
  });

  pos d1{3, 1};
  pos d2{0, 0};
  int count0{0};
  progress({0, 0}, &d1, &d2, 0, trees, &count0);

  int count1{0};
  size_t total{1};
  pos ds[] = {{1, 1}, {3, 1}, {5, 1}, {7, 1}, {1, 2}};
  for (auto& d : ds) {
    progress({0, 0}, &d, &d2, 0, trees, &count1);
    total *= count1;
    count1 = 0;
  }
  return {count0, total};
}

} // namespace aoc2020