aboutsummaryrefslogtreecommitdiff
path: root/src/2018/day1/aoc.cpp
blob: aea1e97c1bcb4de7eb9cc5c2d7164f3f86c01361 (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
#include "aoc.h"
#include <set>

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