diff options
author | kaiwu <kaiwu2004@gmail.com> | 2022-04-07 16:27:23 +0800 |
---|---|---|
committer | kaiwu <kaiwu2004@gmail.com> | 2022-04-07 16:27:23 +0800 |
commit | c1ef11f0ff4a5c518caa13c472188fac8fd7981c (patch) | |
tree | da9c1d852ee82cb672ed959e6b6cefc803db0661 /src/2020/day3/aoc.cpp | |
parent | aceeab407127fc3997505ac93508e4a2513ee313 (diff) | |
download | advent-of-code-c1ef11f0ff4a5c518caa13c472188fac8fd7981c.tar.gz advent-of-code-c1ef11f0ff4a5c518caa13c472188fac8fd7981c.zip |
2020 day3 part1
Diffstat (limited to 'src/2020/day3/aoc.cpp')
-rw-r--r-- | src/2020/day3/aoc.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/2020/day3/aoc.cpp b/src/2020/day3/aoc.cpp index 849bad9..e135988 100644 --- a/src/2020/day3/aoc.cpp +++ b/src/2020/day3/aoc.cpp @@ -1,5 +1,48 @@ #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); + } + } } + +int 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 count{0}; + progress({0, 0}, &d1, &d2, 0, trees, &count); + + return count; +} + +} // namespace aoc2020 |