aboutsummaryrefslogtreecommitdiff
path: root/src/2017/day11/aoc.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/2017/day11/aoc.h')
-rw-r--r--src/2017/day11/aoc.h36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/2017/day11/aoc.h b/src/2017/day11/aoc.h
index 1270e1a..afd1cb2 100644
--- a/src/2017/day11/aoc.h
+++ b/src/2017/day11/aoc.h
@@ -6,5 +6,41 @@ namespace aoc2017 {
enum class hd { n, ne, nw, se, sw, s };
+// a, r, c
+// n: a, r-1, c
+// nw: 1-a, r-(1-a), c-(1-a)
+// sw: 1-a, r+a, c-(1-a)
+// ne: 1-a, r-(1-a), c+a
+// se: 1-a, r+a, c+a
+// s: a, r+1, c
+struct hexagon {
+ int a;
+ int r;
+ int c;
+
+ hexagon neighbour(hd d) {
+ switch (d) {
+ case hd::n:
+ return {a, r - 1, c};
+ case hd::ne:
+ return {1 - a, r - (1 - a), c + a};
+ case hd::nw:
+ return {1 - a, r - (1 - a), c - (1 - a)};
+ case hd::se:
+ return {1 - a, r + a, c + a};
+ case hd::sw:
+ return {1 - a, r + a, c - (1 - a)};
+ case hd::s:
+ return {a, r + 1, c};
+ }
+ return *this;
+ }
+
+ friend bool operator==(hexagon h1, hexagon h2) { return h1.a == h2.a && h1.r == h2.r && h1.c == h2.c; }
+ friend bool operator<(hexagon h1, hexagon h2) {
+ return h1.a < h2.a ? true : h1.a > h2.a ? false : h1.r < h2.r ? true : h1.r > h2.r ? false : h1.c < h2.c;
+ }
+};
+
std::pair<int64_t, int64_t> day11(line_view);
} // namespace aoc2017