diff options
Diffstat (limited to 'src/2018/day1/aoc.cpp')
-rw-r--r-- | src/2018/day1/aoc.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/2018/day1/aoc.cpp b/src/2018/day1/aoc.cpp index 1d092ff..aea1e97 100644 --- a/src/2018/day1/aoc.cpp +++ b/src/2018/day1/aoc.cpp @@ -1,3 +1,43 @@ #include "aoc.h" +#include <set> -namespace aoc2018 {} +namespace aoc2018 { +int parse_day1(line_view lv) { + const char* p = lv.line; + int sign = *p++ == '+' ? 1 : -1; + int s{0}; + while (*p >= '0' && *p <= '9') { + s = s * 10 + *p - '0'; + p++; + } + return sign * s; +} + +int day1(line_view file) { + int sum{0}; + + per_line(file, [&sum](line_view lv) { + sum += parse_day1(lv); + return true; + }); + return sum; +} + +int day1part2(line_view file) { + std::set<int> frequencies; + + int f{0}; + bool found{false}; + while (!found) { + per_line(file, [&f, &frequencies, &found](line_view lv) { + f += parse_day1(lv); + // printf("%d\n", f); + auto p = frequencies.insert(f); + found = !p.second; + return p.second; + }); + } + return f; +} + +} // namespace aoc2018 |