aboutsummaryrefslogtreecommitdiff
path: root/src/2017/day2/aoc.cpp
blob: 9ad3af79b75d523296a0837cae64867ad55866ad (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
68
#include "aoc.h"
#include <vector>
#include <climits>

namespace aoc2017 {

int get_number(const char** pp) {
  const char* p = *pp;
  int d{0};
  while (*p >= '0' && *p <= '9') {
    d = d * 10 + *p - '0';
    p++;
  }
  *pp = p;
  return d;
}

int evenly_divisible(int x, int y) {
  int max = std::max(x, y);
  int min = std::min(x, y);
  return max % min == 0 ? max / min : 0;
}

int diffr(size_t i, const std::vector<int>& v) {
  if (i == v.size() - 1) {
    return 0;
  } else {
    for (size_t j = i + 1; j < v.size(); j++) {
      int d = evenly_divisible(v[i], v[j]);
      if (d > 0) {
        return d;
      }
    }
    return diffr(i + 1, v);
  }
}

int diff(line_view lv, std::vector<int>& v) {
  int max{INT_MIN};
  int min{INT_MAX};
  const char* p = lv.line;
  while (p < lv.line + lv.length) {
    if (*p >= '0' && *p <= '9') {
      int d = get_number(&p);
      if (d > max)
        max = d;
      if (d < min)
        min = d;
      v.push_back(d);
    }
    p++;
  }
  return max - min;
}

std::pair<int, int> day2(line_view file) {
  int sum1{0};
  int sum2{0};
  per_line(file, [&sum1, &sum2](line_view lv) {
    std::vector<int> v;
    sum1 += diff(lv, v);
    sum2 += diffr(0, v);
    return true;
  });
  return {sum1, sum2};
}

} // namespace aoc2017